ID Verification提供Android用戶端SDK,協助您在業務應用(App)中實現eKYC遠程身分識別驗證功能。您可通過服務端認證初始化介面,擷取唯一標識transactionId,並使用transactionId喚起用戶端SDK。本文結合範例程式碼介紹Android用戶端的接入流程。
使用限制
僅支援Android 4.3及以上系統版本的移動智慧型裝置(手機或iPad)接入。不支援x86架構。
許可權說明
為提升安全效果,當前SDK需要以下許可權:
許可權 | 是否必須 | 說明 |
android.permission.INTERNET | 是 | 連網許可權。Android SDK需要連網才能使用。 |
android.permission.ACCESS_NETWORK_STATE | 否(推薦開啟) | |
android.permission.CAMERA | 是 | 網路攝影機許可權。該許可權在Android 6.0及以上版本屬於動態許可權。 |
SDK下載和配置
下載Android SDK,該SDK為Android標準aar包。
下載完畢之後解壓,將Android SDK檔案夾中的所有aar檔案拷貝到工程下的libs目錄中,並在工程的build.gradle檔案中添加如下依賴。
dependencies { // SDK modules implementation files('libs/idv-identityplatform-xxx.aar') implementation files('libs/idv-identityface-xxx.aar') implementation files('libs/idv-ientitycrypto-xxx.aar') implementation files('libs/idv-identityocr-xxx.aar') implementation files('libs/tygerservice-xxx.aar') implementation files('libs/Android-AliyunFaceGuard-xxx.aar') implementation files('libs/idv-identitybase-sdk-xxx.aar') implementation files('libs/idv-identityservice-sdk-xxx.aar') implementation files('libs/idv-identityquality-sdk-xxx.aar') implementation files('libs/idv-identityblink-sdk-xxx.aar') implementation files('libs/idv-identitymnn-xxx.aar') implementation files('libs/idv-identityocrservice-xxx.aar') implementation files('libs/idv-identitynfc-xxx.aar') implementation files('libs/IDOCR_PubSDK_Android-1.0.0.aar') // 或者用fileTree 方式依賴指定IDVID Verification服務SDK AAR目錄, //implementation(fileTree(dir: "libs", includes: ["*.aar"])) implementation "androidx.appcompat:appcompat:1.5.0" implementation "androidx.activity:activity:1.7.0" implementation "androidx.recyclerview:recyclerview:1.0.0" implementation 'com.squareup.okhttp3:okhttp:4.9.3' implementation 'com.squareup.okio:okio:2.8.0' implementation 'com.aliyun.dpa:oss-android-sdk:2.9.21' implementation 'com.alibaba:fastjson:1.2.83_noneautotype' }說明上述依賴中,xxx代表SDK的具體版本號碼。
使用中不能缺少三方依賴庫,否則會導致SDK功能異常。
介面說明
Android SDK包含初始化SDK(install)、擷取MetaInfo(getMetaInfo)和開始認證(verify)介面。
初始化SDK(install)
函數原型
public void install(Context context); public void install(Context context,Map<String, String> options);參數說明
context:當前Application的context。
options:資訊採集可選項,預設可以為null。選擇性參數如下:
重要ID Verification用戶端內建裝置助手安全模組,為了滿足不同地區資料收集合規要求,提供了不同的資料上報地區。您可以基於使用者屬性不同,設定
CustomUrl和CustomHost指定不同的上報網站。一次應用會話生命週期內只能指定一個地區上報,且服務端查詢時地區需要和上報地區保持一致。各產品服務端支援的地區有所不同,詳情請參考支援的地區。
各地區的
CustomUrl:中國香港:
https://cloudauth-device.cn-hongkong.aliyuncs.com新加坡:
https://cloudauth-device.ap-southeast-1.aliyuncs.com印尼(雅加達):
https://cloudauth-device.ap-southeast-5.aliyuncs.com美國(矽谷):
https://cloudauth-device.us-west-1.aliyuncs.com德國(法蘭克福):
https://cloudauth-device.eu-central-1.aliyuncs.com
欄位名
說明
樣本
IPv6
是否使用IPv6網域名稱上報裝置資訊:
0(預設):否(使用IPv4網域名稱)
1:是(使用IPv6網域名稱)
"1"
DataSwitch
裝置資訊上報時機。
0(預設):初始化時
1:擷取Token時
說明建議採用預設配置。
"1"
CustomUrl
設定資料上報伺服器網域名稱。
"https://cloudauth-device.ap-southeast-1.aliyuncs.com"
CustomHost
設定資料上報伺服器host。
"cloudauth-device.ap-southeast-1.aliyuncs.com
傳回值:無。
擷取MetaInfo (getMetaInfo)
函數原型
public static String getMetaInfo(Context context);參數說明
名稱
類型
說明
context
Context
當前Application的context。
傳回值:String類型,以JSON字串格式返回當前行動裝置端的環境資訊:
{ "apdidToken": "", "appName": "com.aliyun.identity.platform", "appVersion": "1.0.1", "bioMetaInfo": "5.1.0:11501568,4", "deviceBrand": "xxx", "deviceManufacturer": "xxx", "deviceModel": "xxx", "deviceType": "android", "identityVer": "1.0.0", "osVersion": "10", "sdkVersion": "1.0.9" }
開始認證(verify)
調用此方法前,請確認您已將 MetaInfo 傳遞至服務端,並通過 Initialize 介面擷取了 transactionId 。
新版本新增protocol欄位返回,新增的protocol通過擴充參數extParams傳入。
函數原型
public void verify(String transactionId, Map<String, String> extParams, IdentityCallback callback);參數說明
名稱
類型
說明
transactionId
String
從服務端初始化認證介面(Initialize)擷取的transactionId。
重要每個transactionId只能調用一次verify函數,每次調用verify函數之前務必重新擷取transactionId。
extParams
Map<String, String>
擴充參數,通常情況下傳null即可。
目前支援的自訂欄位,extParams配置說明在下方表格中列出。
callback
IdentityCallback
認證結果的回調介面,回調中的返回碼參見下文IdentityResponse.code表。
回調定義如下:
public class IdentityResponse { // See the description of "Return Code". public int code; // Result code description. public String message; } public interface IdentityCallback { boolean response(IdentityResponse response); }extParams配置說明
Key
說明
樣本(String類型)
IdentityParams.OcrResultButtonColor
OCR識別結果頁面的底部按鈕顏色。
#FF0000
IdentityParams.RoundProgressColor
掃臉時的圓圈顏色。
#FF0000
IdentityParams.ShowBlbumIcon
證件OCR識別環節,是否展示相簿上傳入口:
1(預設):展示
0:不展示
1
IdentityParams.ShowOcrResult
證件OCR識別環節,是否展示識別結果頁:
1(預設):展示
0:不展示
1
IdentityParams.EditOcrResult
證件OCR識別環節,識別結果頁是否可編輯:
1(預設):可編輯
0:不可編輯
1
IdentityParams.MaxErrorTimes
重試次數上限。
可設定範圍為3~10次,預設10次。
10
IdentityParams.CardOcrTimeOutPeriod
OCR識別環節逾時時間長度。
可設定範圍為20~60秒,預設20秒。
20
IdentityParams.FaceVerifyTimeOutPeriod
活體採集檢測環節逾時時間長度。
可設定範圍為20~60秒,預設20秒。
20
IdentityParams.OcrResultTimeOutPeriod
OCR識別結果頁面可編輯時間長度。
可自訂配置,預設不限。
60
IdentityParams.SdkLanguage
SDK語言自訂設定。預設跟隨行動裝置系統的設定。
說明SDK具體支援的語言列表,請參見Android和iOS SDK 自訂語種。
zh-Hans
IdentityParams.CloseButtonLayout
關閉按鈕的布局:
left(預設):左側
right:右側
left
IdentityParams.WaterMark
OCR識別成功後浮水印文字。
測試浮水印文字
IdentityParams.Protocol
SDK Protocol。
說明通過服務端Initialize介面擷取protocol,傳入擴充參數中,可減少SDK內部介面互動,提升網路體驗。
無
IdentityResponse.code表
錯誤碼
是否計費
結果碼描述
1000
是
使用者完成了刷臉過程,認證建議結果為通過。該結果僅供參考,可通過調用服務端CheckResult介面擷取最終認證結果,並進行下一步處理。
1001
是
使用者完成了刷臉過程,認證建議結果為未通過。該結果僅供參考,可通過調用服務端CheckResult介面擷取最終認證結果、未通過的詳細原因,並進行下一步處理。
1002
否
系統錯誤。
1003
否
SDK初始化失敗。
1004
否
相機許可權錯誤。請參考以下步驟嘗試解決:
在認證前請先確保App已擷取到相機許可權。
如已授權仍提示無許可權,請嘗試清除App緩衝後重試。
1005
否
網路錯誤。
1006
否
使用者退出。
1007
否
TransactionId無效.
1009
否
用戶端時間戳記錯誤。
1011
否
提交證件類型錯誤。
1012
否
識別出的證件關鍵資訊缺失或格式校正失敗。
1013
否
圖片品質不佳。
1014
否
錯誤次數超出上限。
1015
否
安卓系統版本過低。
1016
否
未擷取到相機許可權。
範例程式碼
public class MainActivity extends AppCompatActivity {
private String transactionId = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化SDK
IdentityPlatform.getInstance().install(MainActivity.this);
// 擷取MetaInfo
String metaInfo = IdentityPlatform.getMetaInfo(MainActivity.this);
/**
* 將MetaInfo發送到App伺服器端,調用雲端Initialize介面擷取transactionId,
* 新版本會返回protocol資料
*/
// transactionId = getTransactionIdFromServer(metaInfo).transactionId;
//protocol ==getTransactionIdFromServer(metaInfo).protocol;;
Map<String, String> extParams = new HashMap();
//設定協議資料
extParams.put(IdentityParams.PROTOCOL, protocol);
// 設定SDK語言
extParams.put(IdentityParams.SdkLanguage, "en");
// 開始認證
IdentityPlatform.getInstance().verify(transactionId, extParams,
new IdentityCallback() {
@Override
public boolean response(final IdentityResponse response) {
if (IdentityResponseCode.IDENTITY_SUCCESS == response.code) {
Toast.makeText(MainActivity.this,
"Verification passed", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(MainActivity.this,
"Verification failed([" + response.code + "]" +
response.message + ")",
Toast.LENGTH_LONG).show();
}
return true;
}
});
}
}混淆配置
-verbose
-keep class com.idv.identity.platform.api.** {*;}
-keep class com.idv.identity.platform.log.** {*;}
-keep class com.idv.identity.util.IdentityUtils {*;}
-keep class com.idv.identity.ocr.IdentityOcrApi {*;}
-keep class com.idv.identity.platform.model.** {*;}
-keep class com.idv.identity.platform.config.** {*;}
-keep class com.idv.identity.face.IdentityFaceApi {*;}
-keep class com.face.verify.intl.** {*;}
-keep class com.alibaba.fastjson.** {*;}
-keep class face.security.device.api.** {*;}
-keep class net.security.device.api.** {*;}
-keep class com.dtf.toyger.** { *; }
-dontwarn net.security.device.api.**
-dontwarn face.security.device.api.**
-keep class com.idv.identity.service.algorithm.** {*;}
-keep class com.idv.identity.base.algorithm.** {*;}
-keep class com.idv.identity.quality.QualityRouter {*;}
-keep class com.idv.identity.blink.BlinkRouter {*;}
-keep class com.idv.identity.service.IdentityFaceService {*;}
-keep class com.idv.identity.service.ocr.IdentityDocService {*;}
-keep class com.alibaba.sdk.android.oss.** { *; }
-dontwarn okio.**
-dontwarn org.apache.commons.codec.binary.**
# NFC
-keep class com.idv.identity.nfc.IdentityNfcApi { *; }
-keep class org.jmrtd.** {*;}
-keep class net.sf.**{*;}
-keep class org.**{*;}
-keep class cn.**{*;}
# Please add these rules to your existing keep rules in order to suppress warnings.
# This is generated automatically by the Android Gradle plugin.
-dontwarn com.fasterxml.**
-dontwarn com.google.**
-dontwarn java.applet.Applet
-dontwarn java.awt.**
-dontwarn javax.**
-dontwarn org.**
-dontwarn retrofit2.**
-dontwarn springfox.documentation.spring.web.json.Json
#日誌混淆,可選
-assumenosideeffects class android.util.Log {
public static *** d(...);
}Demo程式碼封裝
您可以下載Android Demo進行體驗。
組件剪裁
是否可裁剪 | 模組名稱 | 模組說明 | 裁剪後的功能影響 | 編譯後體積 | ||
雙架構 | ARM64 | ARMv7 | ||||
不可裁剪 | idv-identitybase-sdk-[version].aar | 基礎模組。 | 不可裁剪 | 0.1MB | ||
不可裁剪 | idv-identityplatform-[version].aar | 基礎模組。 | 不可裁剪 | 0.13MB | ||
不可裁剪 | idv-identitycrypto-[version].aar | 基礎模組。 | 不可裁剪 | 0.44MB | 0.26MB | 0.19MB |
可裁剪 | idv-identityface-[version].aar | Face ServiceUI基礎模組。 | 裁剪後人臉活體功能不可使用 | 0.16MB | ||
可裁剪 | tygerservice-[version].aar | Face Service基礎模組。 | 裁剪後人臉活體功能不可使用 | 2.6MB | 1.67 MB | 1.4MB |
可裁剪 | idv-identitymnn-[version].aar. | mnn模組為人臉活體、人臉品質、OCR自動掃描的基礎組件,裁剪該模組後會導致以上功能不可用。 | 裁剪該模組後,人臉活體、人臉品質、OCR自動掃描功能不可用 | 2.19MB | 1.2MB | 0.99MB |
可裁剪 | idv-identityservice-sdk-[version].aar | 人臉活體檢測。 | 裁剪後人臉活體功能不可使用 | 0.75MB | 0.47MB | 0.42MB |
可裁剪 | idv-identityblink-sdk-[version].intl.aar | 人臉活體眨眼檢測模組。 | 裁剪後人臉眨眼活體功能不可使用 | 0.22MB | ||
可裁剪 | idv-identityquality-sdk-[version].aar | 人臉嚴格品質檢測模組,服務端可選開啟該功能,不需要此功能可裁剪。 | 裁剪後人臉品質、遮擋判斷不生效 | 0.14MB | ||
可裁剪 | idv-identityocr-[version].aar | OCR模組,如果使用ekyc認證該模組不可裁剪。 | 裁剪後OCR功能、eKYC認證功能不可用 | 0.23MB | ||
可裁剪 | idv-identityocrservice-[version].aar | OCR服務模組,實現OCR自動掃描。 | 裁剪後無法實現OCR自動掃描 | 0.61MB | 0.47MB | 0.42MB |
可裁剪 | Android-AliyunFaceGuard-[version].aar | 設定助手模組,保護刷臉過程中端側認證環境安全。 | 該模組保護刷臉過程中端側認證環境安全,裁剪後會削弱安全對抗效果,建議保留 | 3.3 MB | 2.8 MB | 2MB |
可裁剪 | IDOCR_PubSDK_Android-1.0.0.aar | NFC服務模組。 說明 eKYC認證不需要使用NFC功能可裁剪。 | 裁剪後NFC功能不可用 | 5.2MB | ||
可裁剪 | idv-identitynfc-[version].intl.aar | NFC業務模組。 說明 eKYC認證不需要使用NFC功能可裁剪。 | 裁剪後NFC功能不可用 | 0.14MB | ||