# Android 慧眼身份核验SDK
版本历史
时间 | 版本 | 描述 | 作者 |
---|---|---|---|
2021/10/13 | 1.1.1 | 优化了底层算法,提高了安全性和识别速度;优化了人工核验时的提示信息; | Athlar |
# 1 引言
# 1.1 概述
壹证通慧眼身份核验sdk Android 版是一种面向 Android 移动设备身份核验技术开发包,此版SDK包含短信验证,身份证照片采集与OCR识别,人脸活体采集与核验,人工审核等功能,以aar包(aar包中包含动态链接库)的形式发布。基于该方案,开发者可以轻松的构建包含人脸检测、采集、活体识别和身份核验的应用
活体检测 SDK 的集成和使用请仔细阅读本手册,对需要特别注 意的地方,手册中将加以提醒。
# 1.2 开发平台及开发语言
开发平台:Android Studio (建议使用3.0.1以上的release版本) 开发语言:java
# 1.3 SDK兼容性
系统:支持 Android 4.4(API Level 19)及以上系统。需要开发者通过 minSdkVersion来保证支持系统的检测。
机型:手机和平板皆可
构架:支持 CPU架构平台【arm-v7,arm-64】
网络:支持 WIFI 及移动网络,移动网络支持使用NET 网关及 WAP 网关(CMWAP、CTWAP、UNIWAP、3GWAP)。
# 1.4 活体介绍
活体检测:通过让用户做出指定人脸配合式的交互动作,识别当前操作者是否为活体,此功能为离线使用,可设定指定动作是否使用及应用顺序。动作包含:眨眼、张嘴、左摇头、右摇头、向上抬头,向下低头六个。可有效抵御高清图片、3D建模、视频等攻击。
人脸质量检测:判断视频流中的图片帧中,哪些图片质量较佳,即人脸图像特征清晰(满足角度、姿态、光照、模糊度等校验)。
人脸图像采集:通过本地SDK能力,采集人脸图像,同时经过人脸质量检测,确保采集到的人脸图像符合各条件校验(角度、姿态、光照、模糊度等),为设备前端获取有效可分析人脸的主要功能。
离线授权:SDK的授权判断,授权介质也称为license,在SDK使用中,需要通过license向授权服务器发起请求,判断SDK的使用合法性及使用有效期。
# 1.5 功能介绍
# 1.5.1 个人身份核验
核验流程,核验的流程分为FULL全流程,FAST快速认证流程,SECOND二次认证流程。
- FULL全流程,即会进行短信验证,身份证正反面采集与OCR识别,人脸活体采集与核验等全部验证操作
- FAST快速认证流程,与全流程类似,只是不会存储用户数据,也包含上述认证流程。
- SECOND二次认证流程,即人脸活体采集与核验,二次认证流程只会核验人脸,不做其他的核验。二次认证的前提是用户完整的走过并且成功完成全流程的核验。
除此之外,SDK中还有提交人工审核的功能,且该功能只会在全流程中出现,当最终核验不通过时,会提醒用户提交人工审核。
注意:具体采用哪个流程不受SDK控制,而是由服务端下发的token决定,token中指定使用哪个流程,SDK就会进行哪个流程的核验。
# 1.5.2 企业认证
企业认证流程包含短信验证,用户实名认证,活体采集与验证,企业信息登记,企业信息认证等。
# 2 SDK集成
# 2.1 SDK内容说明
1、活体检测sdk只有一个spiderid-Insight-liveness-sdk-xxx.aar的aar包,该包中包含了动态链接库。开发者只需要导入该aar包即可。
2、SDK在使用之前需要向活体验证服务器提供您工程的applicationId(即应用包名)和应用的签名文件的MD5值
注意:icense的授权文件需要您工程的applicationId(即应用包名)和应用的签名文件的MD5值。具体流程可联系壹证通商务
如下图所示:
![](/images/androidsdk/BEEFB0A326F.png)
具体配置方法可咨询技术支持
注意:SDK需要对授权文件进行校验,所以,在debug和release模式下都需要带上签名。详见demo中的配置
# 2.2 SDK导入
将spiderid-Insight-liveness-sdk-xxx.aar放入libs包下面 如图所示:
![](/images/androidsdk/1536287251810.jpg)
gradle配置如图所示:
sdk中部分模块使用kotlin开发,所以需要项目配置支持kotlin。 如:在gradle中配置
- 在项目的根gradle中配置
buildscript {
ext.kotlin_version = '1.4.21'
repositories {
google()
jcenter()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:4.0.2'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
- 在app的gradle中配置
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
android{
......
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation fileTree(include: ['*.aar'], dir: 'libs')
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'androidx.recyclerview:recyclerview:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
implementation 'androidx.annotation:annotation:1.1.0'
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
}
}
具体配置可参照demo
# 3 SDK参数配置
1、授权文件idl-license.face-android放到assets目录下
2、在UnitidFaceConfig
类中配置授权文件和授权id
如下图:
![](/images/androidsdk/1536287849969.jpg)
注意:授权文件的下发会包含授权文件的ID,配置的过程中务必保持授权文件id与下发下来的一致,同时licenseFileName要与授权文件的文件名保持一致,不可存在差异
3、在自定义application中初始化活体检测sdk 如下:
public class MyApplication extends MultiDexApplication {
private static final String TAG = MyApplication.class.getSimpleName();
private static MyApplication instance;
public static MyApplication getContext(){
return instance;
}
@Override
public void onCreate() {
super.onCreate();
instance = this;
initLib();
}
/**
* 初始化活体检测SDK
*/
private void initLib() {
// SDK初始化
IdentityVerificationSdk.initializeSDK(this, UnitidFaceConfig.licenseID,
UnitidFaceConfig.licenseFileName,new IInitCallback() {
@Override
public void initSuccess() {
LogUtils.i(TAG, "初始化成功");
}
@Override
public void initFailure(int paramInt, String paramString) {
LogUtils.e(TAG, "初始化失败 = "+paramInt+" "+paramString);
}
});
// 配置活体采集的动作,默认动作是眨眼
ActionConfig.setAction(LivenessTypeEnum.Eye);
}
}
4、权限声明
SDK的使用需要以下权限,这些权限SDK不负责申请,需要APP主动申请,只有当以下权限全部授权成功后,SDK方可正常使用。
名称 | 用途 |
---|---|
android.permission.INTERNET | 允许应用联网,SDK联网授权。 |
android.permission.READ_PHONE_STATE | 获取用户手机的 IMEI,用来唯一的标识用户(关于android 10之后无法获得IMEI的情况,SDK会自动采用另一种方式) |
android.permission.CAMERA | 允许调用相机进行拍照 |
android.permission.ACCESS_NETWORK_STATE | 获取当前设备的网络状态 |
android.permission.WRITE_EXTERNAL_STORAGE | 图片临时存储 |
android.permission.READ_EXTERNAL_STORAGE | 图片临时存储 |
android.permission.RECORD_AUDIO | 音频录制权限 |
android.permission.ACCESS_WIFI_STATE | 获取当前设备的WIFI连接状态 |
# 4 慧眼身份核验sdk调用
# 4.1 个人身份核验
sdk的调用通过SpiderIdSdkManager
中的public static void verifyPersonalInfo(Activity activity, String authToken)
方法。
参数描述
activity
:activity,必填项authToken
:从服务端获取到授权token,必填项。
调用:SpiderIdSdkManager.verifyPersonalInfo(activity, authToken);
具体的调用方法,请参考demo
流程结束后SDK会将核验的结果回调给前端,如下所示:
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
if (data != null) {
if (SpiderIdSdkManager.VERIFY_PERSONAL_INFO_REQUEST_CODE == requestCode) {
// 个人信息核验
int code = data.getIntExtra(SpiderIdConstants.CODE, -1);
String message = data.getStringExtra(SpiderIdConstants.MESSAGE);
if (SpiderIdCode.SUCCESS == code) {
// 核验成功
Toast.makeText(this, "个人信息认证成功", Toast.LENGTH_LONG).show();
} else if (SpiderIdCode.MANUAL_AUDIT == code) {
// 已提交人工审核
Toast.makeText(this, "已进入人工审核", Toast.LENGTH_LONG).show();
} else if (SpiderIdCode.GET_PAGE_TOKEN_FAILURE == code) {
// 获取页面配置信息失败
Toast.makeText(this, message, Toast.LENGTH_LONG).show();
} else if (SpiderIdCode.INVALID_TOKEN == code) {
// 无效的token
Toast.makeText(this, "无效的token", Toast.LENGTH_LONG).show();
} else if (SpiderIdCode.CANCEL == code) {
// 用户取消操作
Toast.makeText(this, "用户取消操作", Toast.LENGTH_LONG).show();
} else {
// 其他失败情况
Toast.makeText(this, message, Toast.LENGTH_LONG).show();
}
}
}
super.onActivityResult(requestCode, resultCode, data);
}
错误码描述:
SpiderIdCode.SUCCESS
: 核验成功
SpiderIdCode.MANUAL_AUDIT
:提交人工审核
SpiderIdCode.CANCEL
:用户取消操作
SpiderIdCode.INVALID_TOKEN
:无效的token
SpiderIdCode.GET_PAGE_TOKEN_FAILURE
:获取页面会话token失败
SpiderIdCode.FAILURE
:其他失败
# 4.2 企业信息认证
sdk的调用通过SpiderIdSdkManager
中的public static void verifyEnterprise(Activity activity, String authToken)
方法。
参数描述
activity
:activity,必填项authToken
:从服务端获取到授权token,必填项。
调用:SpiderIdSdkManager.verifyEnterprise(activity, authToken);
具体的调用方法,请参考demo
流程结束后SDK会将核验的结果回调给前端,如下所示:
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
if (data != null) {
if (SpiderIdSdkManager.VERIFY_ENTERPRISE_INFO_REQUEST_CODE == requestCode) {
// 企业信息核验
if (data == null) {
return;
}
int code = data.getIntExtra(SpiderIdConstants.CODE, -1);
String message = data.getStringExtra(SpiderIdConstants.MESSAGE);
if (SpiderIdCode.SUCCESS == code) {
// 认证完成
Toast.makeText(this, "认证完成", Toast.LENGTH_LONG).show();
} else if (SpiderIdCode.INVALID_TOKEN == code) {
// 无效的token
Toast.makeText(this, "无效的token", Toast.LENGTH_LONG).show();
} else if (SpiderIdCode.ACTIONING == code) {
// 认证中
Toast.makeText(this, "认证中", Toast.LENGTH_LONG).show();
} else {
// 其他失败情况
Toast.makeText(this, message, Toast.LENGTH_LONG).show();
}
}
}
super.onActivityResult(requestCode, resultCode, data);
}
注意:需要注意的是个人信息核验需要的authToken与企业信息认证需要的authToken不一样,不可混用,两种核验需要各自的authToken
# 5 活体检测sdk中关于人脸采集页面的UI自定义
# 5.1 通过配置的形式修改人脸采集页面的颜色
// 人脸采集页面的文本颜色
<color name="face_text_color">#FF37A8FF</color>
// 人脸采集页面的背景色
<color name="face_background_color">#FFFFFF</color>
// 人脸rect颜色,一般和背景色一致
<color name="face_rect_color">#FFFFFF</color>
// 人脸框的颜色配置
<color name="face_round_color">#429DFB</color>
以上是SDK中人脸采集页面的默认配色,如果您需要更改配色,直接在您的color配置文件中以同名的方式重新定义颜色即可。
# 5.2 通过配置修改人脸采集页面上的icon
人脸采集页面关闭icon,ic_face_detect_close_ext.png宽高为96*96
人脸采集页面静音icon,ic_face_detect_disable_sound_ext.png宽高为96*96
人脸采集页面开启声音icon,ic_face_detect_enable_sound_ext.png宽高为96*96
人脸采集页面活体采集成功的提示icon,ic_face_detect_success.png宽高为171*171
人脸采集页面警告icon,ic_face_detect_warning.png宽高为171*171
以上是SDK中人脸采集页面中用到的默认的icon,如果您需要更改,您可以在mipmap-xxhdpi文件夹下,以同名的方式替换成您的自定义icon
# 6 注意事项
debug模式下的运行也需要携带签名,也就是说在任何模式下的运行都需要携带签名文件,SDK需要对授权文件,签名文件,包名等进行合法性校验。
# 7 混淆说明
-keep cn.unitid.liveness.** { *; }
-keep com.baidu.** { *; }
# 8 版权说明
版权归南京壹证通信息科技有限公司 (opens new window)所有,未经许可禁止翻印。