开放能力
开发平台
行业应用
生态合作
开发与教学
资讯 社区 控制台
技术能力
语音技术
文字识别
人脸与人体
图像技术
语言与知识
视频技术
AR与VR
数据智能
场景方案
部署方案
行业应用
智能教育
智能医疗
智能零售
智能工业
企业服务
智能政务
信息服务
智能园区

Android-方案集成指南


本文档介绍了金融级APP实名认证方案Android端APP集成开发流程。

一、运行示例工程

1、Demo运行

从控制台下载示例工程包之后,先将AndroidManifest.xml中的com.baidu.idl.face.demo.liantian.ac.provider修改为您的包名,build.gradle中的applicaitonId.liantian.ac.provider。然后在build.gradle中配置好包名和签名。

android {
    defaultConfig {
        ...
        applicationId "申请时的包名"
        ...
    }
    signingConfigs {
        def password = "替换为签名密码"
        def alias = "替换为签名别名"
        def filePath = "替换为签名文件路径"
        keyAlias alias
        keyPassword password
        storeFile file(filePath)
        storePassword(password)
    }
    release {
        keyAlias alias
        keyPassword password
        storeFile file(filePath)
        storePassword(password)
    }
}

2、SDK集成

首先在app工程中导入demo工程中的faceplatform-ui 模块、lib-liantian模块,ocr_ui模块(如果需要使用OCR身份证识别能力,则需要导入,不需要则不导入)。

在app工程的build.gradle中添加依赖,引入faceplatform-ui和ocr_ui依赖,然后sync。

dependencies {
   compile project(': faceplatform-ui)
   compile project(': ocr_ui)
}

3、授权文件、加密文件

请将创建App方案时获取的人脸授权文件(idl-license.face-android)、加密文件(idl-key.face-android)放置于Assets目录下。如果使用OCR身份证识别功能,请将OCR身份证识别授权文件(aip.license)也放置于Assets目录下。

二、安全人脸SDK接口

1、隐私协议接口

用户同意隐私协议之后调用此接口,在同意隐私协议前,所有人脸能力的调用均会失败,直到同意了隐私协议。

void LH.setAgreePolicy(Context context, boolean agree)

-参数说明

agree:用户是否同意了隐私协议,true为同意,false为不同意。

2、安全能力初始化接口

在开始采集人脸的流程前,调用安全能力初始化接口。请保证在调用此方法之前请确认setAgreePolicy方法已经调用,并且agress为true,否则采集流程将无法启动。

void LH.init(Context context, String licenseId);

-参数说明

licenseId:Face为App分配的许可Id,在AI开放平台创建App时获取。

3、人脸能力初始化接口

在开始采集人脸的流程前,调用人脸能力初始化接口。请保证在调用此方法之前LH.init方法已经调用。

FaceSDKManager.getInstance().initialize(mContext, Config.licenseID,
        Config.licenseFileName, new IInitCallback() {
            @Override
            public void initSuccess() {}

            @Override
            public void initFailure(final int errCode, final String errMsg) {
                runOnUiThread(new Runnable() {});
            }
        });

-参数说明:

licenseId:Face为App分配的许可Id,在AI开放平台创建App时获取。

licenseFileName:Face为App分配的授权文件名称,默认名称为idl-license.face-android。

new IInitCallback():见“初始化IInitCallback回调接口”。

4、初始化IInitCallback回调接口

人脸能力初始化接口回调,错误码和错误信息如下表。

错误码 说明
SUCCESS(0) 用户取消操作
LICENSE_NOT_INIT_ERROR(1) license未初始化
LICENSE_DECRYPT_ERROR(2) license数据解密失败
LICENSE_INFO_FORMAT_ERROR(3) license数据格式错误
LICENSE_KEY_CHECK_ERROR(4) license-key校验错误
LICENSE_ALGORITHM_CHECK_ERROR(5) 算法ID校验错误
LICENSE_MD5_CHECK_ERROR(6) MD5校验错误
LICENSE_DEVICE_ID_CHECK_ERROR(7) 设备ID校验错误
LICENSE_PACKAGE_NAME_CHECK_ERROR(8) 包名(应用名)校验错误
LICENSE_EXPIRED_TIME_CHECK_ERROR(9) 过期时间不正确
LICENSE_FUNCTION_CHECK_ERROR(10) 功能未授权
LICENSE_TIME_EXPIRED(11) 授权已过期
LICENSE_LOCAL_FILE_ERROR(12) 本地文件读取失败
LICENSE_REMOTE_DATA_ERROR(13) 远程数据拉取失败
LICENSE_LOCAL_TIME_ERROR(14) 本地时间校验错误
OTHER_ERROR(other) 其他错误

5、人脸配置

设置配置参数,如不设置,将使用默认值。

人脸配置通过console平台下发,可以参考demo工程assets目录下的console_config.json文件,相关配置代码参考demo的app模块。

FaceConfig config = FaceSDKManager.getInstance().getFaceConfig();
FaceSDKManager.getInstance().setFaceConfig(config);

6、人脸采集流程(SurfaceView实现)

该方法是异步方法,调用后执行炫彩活体采集流程,该流程需要一个在界面显示的SurfaceView实现。可以参考demo的faceplatform-ui模块。

boolean LH.startFaceSurfaceLiveness(Activity activity,SurfaceHolder previewSurfaceHolder, FaceProcessCallback callback, int deviceCheckTimeout)

-参数说明:

activity:执行人脸采集的Activity。

previewSurfaceHolder:用于展示摄像头预览的SurfaceView的Holder。

processCallback:流程回调,见“FaceProcessCallback接口”。

deviceCheckTimeout:安全检测超时时间,此处需要传0,开启后台检测,传-1则跳过检测。

-返回值说明:

若本方法返回false,则流程启动失败,此时传入的callback对象的onEnd方法会回调失败原因。

7、人脸采集流程(TextureView实现)

该方法是异步方法,调用后执行炫彩活体采集流程,该流程需要一个在界面显示的TextureView实现。可以参考demo的faceplatform-ui模块。

boolean LH. startFaceTextureLiveness(Activity activity,                                               TextureView previewTextureView, FaceProcessCallback callback, int deviceCheckTimeout, IFaceProcessInfo info, boolean record)

-参数说明:

activity:执行人脸采集的Activity。

TextureView:用于展示摄像头预览的TextureView。

processCallback:流程回调,见“采集回调FaceProcessCallback接口”。

deviceCheckTimeout:安全检测超时时间,此处需要传0,开启后台检测,传-1则跳过检测。

record:是否进行视频录制,若否,则onEnd返回的RequestInfo中path为null,若是,该path字段为加密视频文件的路径。注意,本SDK不负责删除该文件,请在使用后删除该加密视频文件,以免硬盘被过度占用。

-返回值说明:

若本方法返回false,则流程启动失败,此时传入的callback对象的onEnd方法会回调失败原因。

8、采集回调FaceProcessCallback接口

回调类,回调方法顺序随人脸采集流程自上向下:

(1)onDeviceCheckResult (int status)

回调设备风险检测结果。无风险或未知风险会进入人脸采集流程,若有风险,则不会进行人脸采集流程。此回调方法return后,会直接回调onEnd方法。

status:1代表无风险,-1代表有风险。

(2)回调人脸采集过程的阶段性结果,供APP刷新界面。

status:按FaceStatusNewEnum的枚举值返回的当前状态。

message:需要在界面展示的提示。

livenessScore:活体检测分数。

onCollectCompletion(FaceStatusNewEnum status, String message,                         HashMap<String, ImageInfo> base64ImageCropMap, HashMap<String, ImageInfo> base64ImageSrcMap,int currentLivenessCount,float livenessScore);

(3)onEnd (int status,RequestInfo info)

必有,包括被Cancel的情况,回调流程结束事件。

status:1代表正常结束, <0的值均表示未正常结束。

info:只有在正常结束时有值,其他情况为null。本对象包含sKey,xDeviceId,data和path共4个字段。其中,sKey, xDeviceId为校验用,data为安全相关数据(该数据包含采集的最终图像,以及解密视频文件的必要信息),path为最终加密后的视频文件(仅在Texture实现的活体采集流程,开启录像功能时有值)。请按需使用这些数据。

onEnd的部分status值列举如下:

错误码 说明
1 正常结束,返回云端验证结果
-1 已经有一个采集验证流程在运行
-2 云端验证过程异常
-3 风控验证失败
-4 更严格情形下的风控验证失败
-5 摄像头异常
-6 流程被取消
-7 线程异常
-8 筛选图像异常
-9 采集前流程异常
-10 活体验证步骤异常
-11 预览异常
-12 采集后流程异常
-13 安全能力未初始化
-14 未同意隐私协议
-15 未成功加载安全模块
-17 录制异常
-18 未检出人脸超时
-19 网络异常
-20 炫彩异常
-21 活体分数异常

9、取消正在进行的流程

取消正在进行的人脸采集流程。调用此接口后,取消整个流程。请在Activity的onPause中调用此方法,保证界面离开顶端时流程被取消。下次进入界面应当重新开始人脸验证过程,可以参考demo的faceplatform-ui模块。

void LH.cancelFaceProcess()

10、采集过程中设置语音开关

设置是否开启人脸采集过程的语音提示。只有采集过程中可以通过此方法开启或关闭语音提示。采集前调用此方法不会生效。可以参考demo的faceplatform-ui模块。

void LH.setSoundEnable (boolean enable)

11、OCR身份证初始化

如果需要使用OCR身份证能力,需要对OCR能力进行初始化。可以参考demo的app模块。

OCR.getInstance(this).initAccessToken(new OnResultListener<AccessToken>() {
    @Override
    public void onResult(final AccessToken result) {
    }

    @Override
    public void onError(final OCRError error) {
    }
}, getApplicationContext());

12、OCR身份证在线识别

调用recognizeIDCard进行身份证在线识别,可参考demo的ocr_ui模块。

OCR.getInstance(this).recognizeIDCard(param, new OnResultListener<IDCardResult>() {
    @Override
    public void onResult(final IDCardResult result) {}
    
    @Override
    public void onError(final OCRError error) {}
});

三、采集流程

1、正常采集流程

调用startFaceSurfaceLiveness或startFaceTextureLiveness -> onBegin被回调 -> 设备环境扫描 -> onDeviceCheckResult被回调-> onBeginCollectFaceInfo被回调 -> 开启摄像头(需要保证SurfaceView或TextureView为可见状态) -> onConfigCamera被回调,用户配置摄像头 -> 开始预览 -> onCollectCompletion被回调(多次,需要更新界面,最后一次回调status为OK或DetectRemindCodeTimeout)-> onBeginBuildData 被回调 -> onEnd被回调。

2、异常采集流程

onEnd可能在onBegin后的任何时间被回调,其他中间步骤可能会缺失。此种情况下,onEnd会回调错误码。

四、代码混淆

-keep class com.baidu.idl.* { ; }

-dontwarn com.baidu.vis.**

-keep class com.baidu.vis.* { ; }

-dontwarn com.baidu.liantian.**

-keep class com.baidu.sofire.* { ; }

-dontwarn com.baidu.baidusec.**

-keep class com.baidu.baidusec.* { ; }

-dontwarn com.baidu.ocr.**

-keep class com.baidu.ocr.* { ; }

五、注意事项

1、如果之前接入过百度人证核验SDK,如何升级?

删除faceplatform模块和faceplatform-ui模块,然后重新导入demo工程中的faceplatform-ui模块、lib-liantian模块,ocr_ui模块(如果需要使用OCR身份证识别能力,则需要导入),可以参考新版本demo。

2、demo配置完签名和包名之后,运行报错

Manifest merger failed : Attribute provider#com.baidu.liantian.LiantianProvider@authorities value=(com.baidu.idl.face.demo.liantian.ac.provider) from AndroidManifest.xml

将com.baidu.idl.face.demo.liantian.ac.provider修改为您的包名(build.gradle中的applicaitonId).liantian.ac.provider

3、人脸能力初始化的时候,报错初始化失败 = 13 -->local auth failed:6

请确认是否使用了AI开放平台控制台配置的包名、以及签名文件。

4、采集回调FaceProcessCallback接口onEnd方法返回-15,如何处理?

可以在进入人脸界面之前,通过FH.isInitSuc(1)来判断安全模块是否下载成功,如果没有下载成功,建议用户切换网络后尝试。

5、不使用视频录制,如何操作?

视频录制会将活体动作视频的留存在本地,如果使用此视频需要上传到服务端解密。如果不使用直接跳转到不到视频录制的界面即可。

6、如果不想使用OCR身份证识别能力,怎么操作?

不使用OCR身份证识别能力,不需要导入ocr_ui模块,也不需要对OCR能力进行初始化,不需要向工程中放置OCR识别的授权文件。

7、OCR身份证识别初始化的时候,报错初始化失败 = [283502] App identifier unmatch

请确认是否使用了控制台创建应用时配置的文字识别包名、以及签名文件。

8、通过客户端demo如何进行人脸对比/人证核验/在线活体?

因为客户端demo需要配合服务端demo使用,app客户端通过人脸SDK采集人脸数据后,上传app服务端,app服务端通过ak、sk请求百度服务器,返回结果。人脸对比/人证核验/在线活体接口请前往方案集成前准备下载服务端示例工程及文档。

上一篇
iOS-方案集成指南
下一篇
标准级H5端实名认证方案