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