Android意愿認證接入
金融級實人認證服務提供Android客戶端SDK,幫助您在業(yè)務應用(App)中實現(xiàn)刷臉認證功能。本文結(jié)合示例代碼介紹Android客戶端的接入流程。
使用限制
Android SDK使用限制如下:
- 不支持模擬器模式調(diào)試。
- 僅支持Android 5.0及以上系統(tǒng)版本的移動智能設備(手機或Pad)接入。
權(quán)限說明
權(quán)限 | 是否必須 | 說明 |
android.permission.INTERNET | 是 | 聯(lián)網(wǎng)權(quán)限。Android SDK需要聯(lián)網(wǎng)才能使用。 |
android.permission.ACCESS_NETWORK_STATE | 是 | |
android.permission.CAMERA | 是 | 攝像頭權(quán)限。該權(quán)限在Android 6.0及以上版本需動態(tài)獲取。 |
android.permission.RECORD_AUDIO | 是 | 錄音權(quán)限。該權(quán)限在Android 6.0及以上版本需動態(tài)獲取。 |
android.permission.FOREGROUND_SERVICE | 是 | 前臺服務權(quán)限,用于錄屏功能。 |
依賴配置
下載Android SDK,該SDK為Android標準AAR包。
下載完畢之后解壓,將Android SDK文件夾中的所有aar文件拷貝到主工程模塊下的libs目錄中(具體以工程實際配置為準),并在模塊對應的build.gradle文件中添加如下依賴:
// 阿里云實人認證服務SDK AAR,fileTree 方式依賴指定目錄
implementation(fileTree(dir: "libs", includes: ["*.aar"]))
// 阿里云實人認證服務三方依賴庫,不能省略
implementation 'com.squareup.okhttp3:okhttp:3.11.0'
implementation 'com.squareup.okio:okio:1.14.0'
implementation 'com.alibaba:fastjson:1.2.83_noneautotype'
接口說明
Android SDK包含初始化SDK(install)、獲取MetaInfos(getMetaInfos)和開始認證(verify)3個接口。
初始化SDK
描述:調(diào)用該函數(shù)完成SDK內(nèi)部初始化。請務必做延遲初始化配置,確保在用戶同意《隱私權(quán)政策》后,在人臉識別業(yè)務場景中初始化SDK。
函數(shù)原型:
public static void install(Context context);
IPv6網(wǎng)絡初始化,示例代碼如下:
public static int installIPv6(Context context)
參數(shù)說明:
名稱
類型
說明
context
Context
當前Application的context。
返回值:無。
獲取MetaInfos
描述:移動端環(huán)境信息發(fā)送至業(yè)務服務器端,業(yè)務服務器端將這些信息作為參數(shù)之一(MetaInfos)調(diào)用服務端初始化認證接口(InitFaceVerify),從而獲取CertifyId,用于后續(xù)認證環(huán)節(jié)。
函數(shù)原型:
public static String getMetaInfos(Context context);
參數(shù)說明:
名稱
類型
說明
context
Context
當前Application的context。
返回值:String類型,以JSON格式返回當前移動設備端的環(huán)境信息。返回值示例如下:
{ "apdidToken": "xxxx", "appName": "com.aliyun.facedemo", "appVersion": "1.2.8", "bioMetaInfo": "6.7.0:21478612992,0", "deviceModel": "Mi 10", "deviceType": "android", "osVersion": "12", "sdkVersion": "2.1.0", "securityVersion": "2", "voiceSdkVersion": "1.0.0", "zimVer": "1.0.0" }
開始認證
描述:調(diào)用該函數(shù)發(fā)起實人認證。
函數(shù)原型:
public void verify(final String certifyId, boolean useMsgBox, HashMap<String, String> extParams, ZIMCallback callback);
- 參數(shù)說明:
參數(shù) 類型 說明 certifyId String 從服務端初始化認證接口(InitFaceVerify)獲取的CertifyId。 說明 每個CertifyId只能調(diào)用一次verify函數(shù),每次調(diào)用verify函數(shù)之前務必重新獲取CertifyId。useMsgBox boolean 當刷臉認證過程中出現(xiàn)異常情況,是否使用SDK內(nèi)部的彈框提示。取值: - true:SDK先彈框提示,確定之后,返回錯誤code。
- false:不彈提示框,直接返回錯誤code,客戶業(yè)務應用App自行決定如何提示。
extParams HashMap<String, String> 暫不支持擴展參數(shù),傳NULL即可。 callback ZIMCallback 認證結(jié)果的回調(diào)接口,定義如下:
ZIMResponse類的定義,詳情請參見認證結(jié)果及錯誤碼。public interface ZIMCallback { boolean response(ZIMResponse response); }
返回值:無。
認證結(jié)果及錯誤碼
認證結(jié)果通過ZIMResponse類返回,定義如下:
public class ZIMResponse {
/**
* 返回結(jié)果編碼
*/
public int code;
/**
* 返回結(jié)果原因信息
*/
public String reason;
// ......
}
錯誤碼 | 是否計費 | 錯誤碼文案 | 錯誤碼描述 |
1000 | 是 | 刷臉成功 | 用戶完成了刷臉過程,認證建議結(jié)果為通過。該結(jié)果僅供參考,可通過調(diào)用服務端DescribeFaceVerify接口獲取最終認證結(jié)果。 |
1001 | 否 | 系統(tǒng)錯誤 | 表示系統(tǒng)錯誤。 |
1003 | 否 | 驗證中斷 | 表示驗證中斷。 |
2002 | 否 | 網(wǎng)絡錯誤 | 表示網(wǎng)絡錯誤。 |
2003 | 否 | 客戶端設備時間錯誤 | 表示客戶端設備時間錯誤。 |
2006 | 是 | 刷臉失敗 | 用戶完成了刷臉過程,認證建議結(jié)果為未通過。該結(jié)果僅供參考,可通過調(diào)用服務端DescribeFaceVerify接口獲取最終認證結(jié)果以及未通過的詳細原因。 |
更多錯誤碼信息,請參見金融級Android客戶端錯誤碼詳情。
接口混淆配置
為避免接口被混淆而造成功能異常,您需要在App工程的proguard-rules.pro文件中添加如下配置信息:
# 必須要依賴到應用混淆中
-keepclassmembers,allowobfuscation class * {
@com.alibaba.fastjson.annotation.JSONField <fields>;
}
-keep class net.security.device.api.** {*;}
-keep class face.security.device.api.** {*;}
-keep class com.alipay.deviceid.** { *; }
-keep class org.json.** { *;}
-keep class com.alibaba.fastjson.** {*;}
# SDK混淆配置
-keep class com.alipay.face.api.** {*;}
-keep class com.alipay.zoloz.toyger.**{*;}
-keep class com.dtf.face.api.** {*;}
-keep class com.dtf.face.ocr.verify.DTFOcrFacade { *; }
-keep class com.dtf.face.verify.** {*;}
-keep class com.dtf.face.network.model.** {*;}
-keep class com.dtf.face.network.APICallback {*;}
-keep class com.dtf.face.config.**{*;}
-keep class com.dtf.face.log.** {*;}
-keep class com.dtf.face.ui.overlay.** {*;}
-keep class com.dtf.face.ui.widget.ToygerWebView {*;}
-keep class com.dtf.face.utils.ClientConfigUtil{
boolean needUploadPreviewTrace*();
boolean needVideoExDegrade*();
boolean isCfgVideoExDevice*();
}
-keep class com.dtf.toyger.base.** {*;}
-keep class com.dtf.face.network.mpass.biz.model.** { *; }
-keep class com.dtf.face.utils.LogUtils { *; }
-keep class com.dtf.wish.api.** { *; }
-keep class com.dtf.wish.ui.** { *; }
-keep class com.dtf.wish.ui.WishFragment{*;}
-keep class com.dtf.voice.api.** { *; }
-keep class xnn.* { *; }
-keep class facadeverify.** { *; }
-keep class baseverify.** { *; }
-keep class faceverify.** { *; }
-keep class ocrverify.** { *; }
-keep class wishverify.** { *; }
# R8編譯混淆配置
-keep class com.dtf.face.ui.toyger.FaceLoadingFragment{ *; }
-keep class com.dtf.face.ui.toyger.FaceShowFragment{*;}
-keep class com.dtf.face.ui.toyger.FaceShowElderlyFragment{*;}
-keepclassmembers class com.dtf.face.camera.ICameraCallback{
void onPreviewFrame*(*);
}
# NFC編譯配置
-keep class com.dtf.face.nfc.verify.DTFNfcFacade { *; }
-keep class com.eidlink.**{*;}
-keep class net.sf.**{*;}
-keep class org.**{*;}
-keep class cn.**{*;}
-keep class com.froad.**{*;}
-keep class com.huawei.**{*;}
-keep class com.eidlink.**{*;}
-keep class org.ejbca.cvc.**{*;}
-keep class org.jmrtd.**{*;}
-keep public class com.netease.nis.sdkwrapper.Utils {public <methods>;}
-keep class net.sf.scuba.**{*;}
-keep class org.eid_bc.bouncycastle.jcajce.provider.symmetric.**{*;}
示例代碼
public class MainActivity extends Activity {
private String certifyId = "xxx";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Context ctx = getApplicationContext();
// 初始化SDK
ZIMFacade.install(ctx);
// 獲取MetaInfos
String metaInfos = ZIMFacade.getMetaInfos(ctx);
// 將MetaInfos發(fā)送到App服務器端,調(diào)用云端InitFaceVerify接口獲取CertifyId。
// certifyId = getCertifyIdFromServer(metaInfo); // 需客戶自己實現(xiàn)
HashMap<String, String> params = new HashMap<>();
// extParams取值示例
params.put("ext_params_key_use_video", "false");
// 開始驗證
ZIMFacade zimFacade = ZIMFacadeBuilder.create(ctx);
zimFacade.verify(certifyId, true, params, new ZIMCallback() {
@Override
public boolean response(ZIMResponse response) {
switch (response.code) {
case 1000:
Log.d("AliyunFace", "認證成功");
break;
case 1001:
Log.e("AliyunFace", "系統(tǒng)錯誤");
break;
case 1003:
Log.e("AliyunFace", "驗證中斷");
break;
case 2002:
Log.e("AliyunFace", "網(wǎng)絡錯誤");
break;
case 2003:
Log.e("AliyunFace", "客戶端設備時間錯誤");
break;
case 2006:
Log.e("AliyunFace", "刷臉失敗");
break;
default:
Log.e("AliyunFace", "未知錯誤");
break;
}
return true;
}
});
}
}
Demo代碼包
您可以下載Android Demo代碼包進行體驗。
SDK包大小裁剪說明
更多說明,請參見SDK包裁剪說明。