开放能力
开发平台
行业应用
生态合作
开发与教学
资讯 社区 控制台
技术能力
语音技术
图像技术
文字识别
人脸与人体识别
视频技术
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实名认证方案