本文结合代码示例介绍信息核验-身份核验产品方案的Android接入流程。
使用限制
仅支持Android 4.3及以上系统版本的移动智能设备(手机或平板)接入。不支持x86架构。
权限说明
为提升安全效果,当前SDK需要以下权限:
权限 | 是否必须 | 说明 |
android.permission.INTERNET | 是 | 联网相关权限。Android SDK需要联网才能使用。 |
android.permission.ACCESS_NETWORK_STATE | 否(推荐开启) | |
android.permission.CAMERA | 是 | 摄像头相关权限。该权限在Android 6.0及以上版本属于动态权限。 |
android.permission.READ_PHONE_STATE | 否(推荐开启) | |
android.permission.READ_EXTERNAL_STORAGE | 否(推荐开启) |
SDK下载和配置
下载Android-CardVerifySDK,该SDK为Android标准aar包。
下载完毕之后解压,将Android SDK文件夹中的所有aar文件拷贝到工程下的libs目录中,并在工程的build.gradle文件中添加如下依赖。
// SDK modules
implementation files('libs/aliyun-identitybase-meta-sdk-xxx.aar')
implementation files('libs/aliyun-identityocrservice-meta-sdk-xxx.aar')
implementation files('libs/aliyun-identitycrypto-meta-sdk-1.0.0.aar')
implementation files('libs/aliyun-identityplatform-meta-sdk-1.0.0.aar')
implementation files('libs/aliyun-identityocr-meta-sdk-xxx.aar')
implementation files('libs/aliyun-identitymnn-meta-sdk-xxx.aar')
// SDK third-party dependency modules
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'com.squareup.okhttp3:okhttp:3.11.0'
implementation 'com.squareup.okio:okio:2.2.2'
implementation 'com.aliyun.dpa:oss-android-sdk:2.9.4'
implementation 'com.alibaba:fastjson:1.1.72.android'
上述依赖中,xxx代表SDK的具体版本号。
使用中不能缺少三方依赖库,否则会导致SDK功能异常。
接口说明
Android SDK包含初始化SDK(install)、获取MetaInfo(getMetaInfo)和开始认证(verify)接口。
初始化SDK(install)
函数原型:
public void install(Context context);
参数说明:
名称
类型
说明
context
Context
当前Application的context。
获取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 传递至服务端,并通过 InitCardVerify 接口获取了 certifyId 。
从服务端获取的 certifyId 对应 verify 方法中的 transactionId 参数。
函数原型:
public void verify(String transactionId, Map<String, String> extParams, IdentityCallback callback);
参数说明:
名称
类型
说明
transactionId
String
从服务端初始化认证接口(InitCardVerify)获取的certifyId。
重要每个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.CardOcrTimeOutPeriod
OCR识别环节超时时长。
可设置范围为20~60秒,默认20秒。
20
IdentityParams.SdkLanguage
SDK默认支持的多语言语种如下:
zh-Hans:中文简体
zh-Hant:中文繁体
en:英文
ja:日文
ko:韩文
id:印尼语
ms:马来语
th:泰语
vi:越南语
说明除上述默认支持的语言外,SDK还支持客户自定义语言,请参见新增语言。
zh-Hans
CloseButtonLayout
关闭按钮的布局:
left:左侧(默认)
right:右侧
left
IdentityResponse.code表:
错误码
是否计费
结果码描述
1000
是
用户完成认证了过程,认证建议结果为通过。该结果仅供参考,可通过调用服务端CheckResult接口获取最终认证结果,并进行下一步处理。
1001
是
用户完成了认证过程,认证建议结果为未通过。该结果仅供参考,可通过调用服务端CheckResult接口获取最终认证结果、未通过的详细原因,并进行下一步处理。
1002
否
系统错误。
1003
否
SDK初始化失败,请确认客户端时间是否正确。
1004
否
相机权限错误。请参考以下步骤尝试解决:
在认证前请先确保App已获取到相机权限。
如已授权仍提示无权限,请尝试清除App缓存后重试。
1005
否
网络错误。
1006
否
用户退出。
1007
否
TransactionId无效.
1009
否
客户端时间戳错误。
1011
否
提交证件类型错误。
1012
否
识别出的证件关键信息缺失或格式校验失败。
1013
否
图片质量不佳。
1014
否
错误次数超出上限。
1015
否
安卓系统版本过低。
1016
否
未获取到相机权限。
新增语言
新增自定义语言,则需要执行以下操作实现:
打开App应用工程(集成ID Verification SDK的module)。
在应用工程下创建目标语言文件夹及 string.xml 语言资源文件。以新增俄罗斯语言为例,在主module工程下面新建俄罗斯语言的values文件夹,将string.xml添加到对应的语言文件夹下面,其他语言同理。
将string.xml文件中的value内容自行翻译成对应的语言。可参考附录1中的模板,将中文修改成目标语言。
在代码中指定自定义的目标语言,格式:“language-country”。如下示例代码以设置俄罗斯语为例:
示例代码
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服务器端,调用云端InitCardVerify接口获取transactionId
*/
// transactionId = getTransactionIdFromServer(metaInfo);
// 设置SDK语言
Map<String, String> extParams = new HashMap<>();
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.aliyun.identity.platform.api.** {*;}
-keep class com.aliyun.identity.IdentityUtils {*;}
-keep class com.aliyun.identity.ocr.IdentityOcrApi {*;}
-keep class com.aliyun.identity.platform.model.** {*;}
-keep class com.aliyun.identity.platform.config.** {*;}
-keep class com.aliyun.meta.verify.service.algorithm.** {*;}
-keep class com.aliyun.meta.verify.base.algorithm.** {*;}
-keep class com.aliyun.meta.verify.service.ocr.IdentityDocService {*;}
-keep class com.alibaba.fastjson.** {*;}
-keep class com.aliyun.identity.platform.log.** {*;}//日志模块混淆,可选
Demo代码包
您可以下载AliyunIdcardVerifyDemo.zip进行体验。