本文從簡單接入(使用限制、接入步驟)和SDK進階使用兩個階段,結合示例代碼介紹Android客戶端的接入流程。
使用限制
Android SDK使用限制如下:
不支持模擬器模式調試。
僅支持Android 4.4及以上系統版本的移動智能設備(手機或Pad)接入。
接入步驟
一、前期準備
接入前需要進行權限配置和SDK依賴配置,您可以參考下面的步驟操作。
折疊框點擊可以收起。
權限說明
Android SDK中使用的權限已經在SDK包中聲明,無需開發者顯式聲明。
SDK中涉及到的權限使用請參見Android應用權限列表。
根據相關合規要求,獲取用戶設備敏感權限需要同步告知權限申請目的。SDK中已經內置了提示,您可以通過合規權限提醒完成相應配置以開啟使用。
依賴配置
下載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包裁剪。
二、調用SDK
前期準備完成后,需要按下面三個動作完成SDK的調用。
初始化(install)
調用該函數完成SDK內部初始化。請務必做延遲初始化配置,確保在用戶同意《隱私權政策》后,在人臉識別業務場景中初始化SDK。
初始化:
ZIMFacade.install(context);
如需使用IPv6網絡初始化,參考如下代碼:
ZIMFacade.installIPv6(context);
context參數為當前Application的context。
獲取MetaInfos(getMetaInfos)
移動端環境信息發送至業務服務器端,業務服務器端將這些信息作為參數之一(MetaInfos)調用服務端初始化認證接口(InitFaceVerify),從而獲取CertifyId,用于后續認證環節。
MetaInfos數據會影響認證服務器提供的服務類型,不要使用硬編碼的模擬數據,否則可能導致無法認證。
調用代碼:
// context參數為當前Application的context。 ZIMFacade.getMetaInfos(context);
注意:此JSON僅作為結構示范,由于不通設備產生的數據不一樣,調試時請使用真實數據,否則可能無法認證。
{ "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" }
調用認證方法(verify)
調用示例如下:
ZIMFacade zimFacade = ZIMFacadeBuilder.create(MainActivity.this);
zimFacade.verify(certifyId,useMsgBox,extParams,callback);
參數 | 類型 | 說明 |
certifyId | String | 從服務端初始化認證接口(InitFaceVerify)獲取的CertifyId。 說明 每個CertifyId只能調用一次verify函數,每次調用verify函數之前務必重新獲取CertifyId。 |
useMsgBox | boolean | 當刷臉認證過程中出現異常情況,是否使用SDK內部的彈框提示。取值:
|
extParams | HashMap <String, String> | 用戶自定義參數,一般直接傳NULL即可。目前支持的自定義字段,extParams取值,詳情請參見下方extParams取值說明。 重要 金融級多因子意愿認證方案暫不支持此參數,傳NULL即可。 |
callback | ZIMCallback | 認證結果的回調接口,定義如下:
ZIMResponse類的使用示例,請參見下文結果處理章節所示的代碼。 |
extParams取值說明
取值 | 說明 | 示例值 |
ext_params_key_use_video | 是否返回活體認證視頻。取值:
| false |
ext_params_key_screen_orientation | 認證界面UI朝向。取值:
| ext_params_val_screen_land |
ext_params_key_face_progress_color | 活體檢測頁面的進度條顏色。 | #FF0000 |
ext_params_key_ocr_bottom_button_color | OCR識別結果確認頁底部按鈕顏色。 | #FF0000 |
完整代碼示例
完整代碼示例如下所示。您也可以下載Android Demo代碼包在本地搭建工程體驗。
public class MainActivity extends Activity {
private String certifyId = "<從服務端InitFaceVerify接口獲取>";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化(install)
ZIMFacade.install(this);
// 獲取MetaInfos
String metaInfos = ZIMFacade.getMetaInfos(this);
// 將MetaInfos發送到App服務器端,調用云端InitFaceVerify接口獲取CertifyId。
// certifyId = getCertifyIdFromServer(metaInfo); // 需客戶自己實現
HashMap<String, String> extParams = new HashMap<>();
// extParams取值示例
extParams.put("ext_params_key_use_video", "false");
// 調用認證方法(verify)
ZIMFacade zimFacade = ZIMFacadeBuilder.create(MainActivity.this);
zimFacade.verify(certifyId, true, extParams,new ZIMCallback() {
@Override
public boolean response(ZIMResponse response) {
if (null != response && 1000 == response.code) {
// 認證成功
Toast.makeText(getApplicationContext(),
"認證成功\n" +
"code: " + response.code + "\n" +
"reason: " + response.reason,
Toast.LENGTH_LONG).show();
} else {
// 認證失敗
Toast.makeText(getApplicationContext(),
"認證失敗\n" +
"code: " + response.code + "\n" +
"reason: " + response.reason,
Toast.LENGTH_LONG).show();
}
return true;
}
});
}
}
三、結果處理:
認證結果通過verify>callback>response方法提供的ZIMResponse對象傳入,示例可參見完整代碼示例。
ZIMResponse對象包含了諸多屬性,結果處理主要關注code(結果編碼)和reason(結果原因)即可,常見的編碼和原因如下表所示。
code | 是否計費 | reason | 描述 |
1000 | 是 | 刷臉成功 | 用戶完成了刷臉過程,認證建議結果為通過。該結果僅供參考,可通過調用服務端DescribeFaceVerify接口獲取最終認證結果。 |
1001 | 否 | 系統錯誤 | 表示系統錯誤。 |
1003 | 否 | 驗證中斷 | 表示驗證中斷。 |
2002 | 否 | 網絡錯誤 | 表示網絡錯誤。 |
2003 | 否 | 客戶端設備時間錯誤 | 表示客戶端設備時間錯誤。 |
2006 | 是 | 刷臉失敗 | 用戶完成了刷臉過程,認證結果為未通過。該結果僅供參考,可通過調用服務端DescribeFaceVerify接口獲取最終認證結果以及未通過的詳細原因。 |
完整結果編碼信息(點擊查看)
為了方便您在離線環境下也可以查詢參考,可以緩存下方表格到本地。
客戶端錯誤碼 | Android |
1000 | Z5120 - 刷臉成功,認證通過。可通過服務端查詢接口獲取認證詳細資料信息 |
1001 | Z1000 - 其他異常 |
Z1001 - 人臉識別算法初始化失敗 | |
Z1002 - 無法啟動相機 | |
Z1003 - 不支持的CPU架構 | |
Z1004 - Android系統版本過低 | |
Z1018 - 無前置攝像頭 | |
Z1019 - 攝像頭權限未賦予 | |
Z1020 - 打開攝像頭失敗 | |
Z1021 - 攝像頭流錯誤 | |
Z1023 - 認證內部錯誤 | |
Z1024 - SDK認證流程正在進行中,請等待本地認證流程完成后再發起新調用 | |
Z1029 - 系統版本過低,不支持錄屏 | |
Z1030 - 錄音權限未賦予 | |
Z1031 - 錄屏權限未賦予 | |
Z1032 - 麥克風打開失敗 | |
Z1033 - 錄屏打開失敗 | |
Z1035 - Context為空 | |
Z1036 - 認證之前沒有調用 install() 接口完成初始化 | |
Z1037 - CertifyId為null或長度為0 | |
Z1056 - 混淆配置錯誤 | |
Z1039 - 多進程使用webview | |
Z1045 - Context為空 | |
Z1046 - 刷臉過程中斷 | |
Z1047 - 模型數據錯誤 | |
Z1048 - 質量認證異常 | |
Z5112 - 上傳炫彩Meta信息失敗 | |
Z5113 - 上傳炫彩視頻失敗 | |
Z5114 - 認證視頻上傳失敗 | |
Z6001 - OCR識別次數超限 | |
Z6003 - OSS Token過期 | |
Z6004 - 人臉照片處理失敗 | |
Z7001 - SDK初始化或者使用過程中數據異常 | |
Z3002 - 拒絕打開系統NFC功能 | |
Z3003 - 設備不支持NFC | |
Z3004 - NFC協議相關異常 | |
Z3005 - 透傳模式三要素錯誤 | |
Z5115_4 - so加載異常 | |
A4001 - 刷臉模塊接入異常 | |
A4002 - 炫彩模塊接入異常 | |
A4003 - OCR模塊接入異常 | |
A4004 - NFC模塊接入異常 | |
A4005 - 意愿模塊接入異常 | |
1003 | Z1005 - 刷臉超時(單次) |
Z1006 - 多次刷臉超時 | |
Z1008 - 用戶在認證過程中點擊X退出 | |
Z1009 - 用戶在授權頁面點擊“暫不授權”退出 | |
Z1013 - 活體檢測不通過 | |
Z1041 - OCR重試次數過多退出 | |
Z1044 - 認證過程中折疊屏設備折疊/展開狀態調整 | |
Z3001 - NFC重試超過限制 | |
2002 | Z1011 - 客戶端初始化網絡錯誤 |
Z1012 - 客戶端網絡訪問異常 | |
Z1025 - 客戶端初始化接口返回網絡錯誤 | |
Z1026 - 信息上傳網絡錯誤 | |
Z1027 - 服務端認證接口網絡錯誤 | |
Z1028 - 服務端接口并發請求超出限制 | |
Z1040 - 刷臉模型下載失敗 | |
Z1042 - OCR認證服務報錯 | |
Z1043 - 刷臉認證服務報錯 | |
Z5116 - 音頻文件上傳失敗 | |
Z6002 - OCR圖片上傳網絡超時 | |
2003 | 客戶端設備時間錯誤 |
2006 | Z5128 - 刷臉失敗,認證未通過。可通過服務端查詢接口獲取認證未通過具體原因。 |
SDK的進階使用
混淆配置(重要)
如果您的工程使用了代碼混淆,請務必在App工程的proguard-rules.pro文件中添加如下配置信息,以防止接口被混淆處理后造成功能異常。
您可以根據實際使用的SDK功能,刪除多余的混淆配置。
# 必須要依賴到應用混淆中
-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.**{*;}
# 忽略警告
-dontwarn okio.**
-dontwarn org.apache.commons.codec.binary.**
SDK包裁剪
一些特殊的場景和需求會使用到SDK包裁剪功能,例如App打包體積要求或者三方依賴沖突等。
如果需要判斷功能是否可裁剪或者需要查找每個包負責的功能描述,請參見SDK包裁剪說明。
SDK UI自定義設置
如果對認證頁面的UI有自定義的需求,SDK提供了UI自定義配置功能,可以對認證頁面的文本、顏色和icon進行配置。
詳細操作,請參見Android SDK UI自定義配置說明。