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 方式依赖指定IDV实人认证服务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 | 人脸识别UI基础模块。 | 裁剪后人脸活体功能不可使用 | 0.16MB | ||
可裁剪 | tygerservice-[version].aar | 人脸识别基础模块。 | 裁剪后人脸活体功能不可使用 | 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 | ||