# Android 慧眼身份核验SDK

版本历史

时间 版本 描述 作者
2021/10/13 1.1.1 优化了底层算法,提高了安全性和识别速度;优化了人工核验时的提示信息; Athlar

# 1 引言

# 1.1 概述

  壹证通慧眼身份核验sdk Android 版是一种面向 Android 移动设备身份核验技术开发包,此版SDK包含短信验证,身份证照片采集与OCR识别,人脸活体采集与核验,人工审核等功能,以aar包(aar包中包含动态链接库)的形式发布。基于该方案,开发者可以轻松的构建包含人脸检测、采集、活体识别和身份核验的应用

  活体检测 SDK 的集成和使用请仔细阅读本手册,对需要特别注 意的地方,手册中将加以提醒。

下载地址 点击立即下载识蛛慧眼 Android 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值。具体流程可联系壹证通商务

如下图所示:

具体配置方法可咨询技术支持

注意:SDK需要对授权文件进行校验,所以,在debug和release模式下都需要带上签名。详见demo中的配置

# 2.2 SDK导入

  将spiderid-Insight-liveness-sdk-xxx.aar放入libs包下面 如图所示:

  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 如下图:

注意:授权文件的下发会包含授权文件的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)所有,未经许可禁止翻印。

最后更新于: 10/15/2021, 3:40:21 PM