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

    方案集成指南

    本文档介绍了增强级APP实名认证方案配置流程,以及APP集成开发流程。

    一、 准备工作

    在正式集成前,需要做一些准备工作,完成一些账号、应用及配置,具体如下:

    Step1: 注册成为开发者

    在使用百度人脸实名认证方案之前,首先需注册百度云账号,账号注册方式请参考账号注册指南

    百度云账号注册完成以后,为顺利调用百度AI能力,需完成企业认证。具体认证方式请参考企业认证指南

    Step2:创建应用

    2.1 输入应用名称,领取免费额度

    • 创建好账号后,在正式调用AI 能力之前,需首先创建应用,应用是调用服务的基础能力单元。 同时领取接口所需的免费调用额度,用于接入测试。如下图所示:

      image.png
    • 除人脸服务接口的免费调用额度外,还需领取身份证识别接口的免费调用额度,用来调用身份证OCR识别功能(必须领取,否则会报错服务异常),点击此处,按下图所示进行领取。
    • 如您之前已经领取过免费额度,无需重复领取,请跳至下一步骤。

    2.2 勾选所需接口

    • 人脸识别服务相关接口已默认勾选且不可取消。

      image.png
    • 注:「接口选择」过程中,还需勾选「文字识别」中的「身份证识别」接口,用于实现身份核验流程中的身份证识别功能。如下图所示。
    实名认证系统-接口选择-1.gif

    2.3 输入应用包名

    • 在「文字识别包名」处选择「需要」,并根据您的APP应用信息填写包名。此处为必要操作,否则将无法顺利下载集成文件。至此应用创建完成。
    image.png

    2.4 获取密钥信息(AK/SK)

    完成应用创建后,平台将会分配给您此应用的相关凭证,主要为AppID、API Key、Secret Key,以上三个信息是您应用实际开发的主要凭证,每个应用之间各不相同,请您妥善保管。您可在控制台的应用管理页面找到以上信息。如下图所示

    image.png image.png

    该AK/SK用于调用在线API 如:身份验证。在之后下载的集成文件(示例工程)中需要填写正确的AK/SK以顺利集成。

    注:开发中请注意区分多份AK/SK(API Key、Secret Key),若填写的AK/SK与开发的应用不对应,会产生鉴权错误。

    Step3:创建项目

    • 进入控制台-人脸实名认证页面,选择『项目管理』页面,点击『新建项目』,进行项目创建,如下图所示。

    创建项目前,请确保您在应用控制台已创建应用,若您未创建应用,请参考STEP2创建应用后,再进行项目创建.

    image.png

    Step4:创建方案

    • 项目创建完成后,点击「方案管理」进入方案管理页面,在这里您可以为您的项目创建不同的方案,如下图所示。
    image.png

    若您的场景为APP场景(安卓/IOS系统),『场景方案』请选择APP实名认证方案;

    若您的场景为微信、H5页面,『场景方案』请选择H5实名认证方案。

    image.png

    4.1 身份信息录入

    • 身份信息录入支持选择用户手动输入OCR拍照采集,如下图所示

    实名认证系统-身份信息录入-1.gif

    OCR拍照采集:会在之后生成的APP集成文件内集成OCR采集SDK,在本地进行身份证质量校验,并判断是否为身份证证件。 (OCR拍照采集支持实时采集和相册上传两种形式。推荐您使用实时采集,可以在一定程度增加方案的安全性及便捷性。)

    手动输入:支持用户手动输入姓名+身份证号信息。

    4.2 离线采集SDK配置

    image.png
    • 填写授权标识:选择SDK的授权标识信息。

    若您还未申请授权标识信息,请点击『新建授权』,并填写相关信息进行申请,申请过程如下图所示。

    image.png image.png
    • 图像质量控制(本地):分为严格、正常、宽松三个等级,等级越严格,对采集图片的角度、模糊度、遮挡等信息参数把控越高,推荐使用正常。

    此项配置为离线采集SDK端对采集图片的质量要求,推荐实名认证场景选择严格或正常模式。图片质量越好,云端接口传输的通过率越高。

    • 活体检测设置(本地):离线采集 SDK在前端要求用户做出指定动作,并检测动作的完成情况。在该过程,SDK 会随机抓取几帧图像进行本地活体检测,检测通过后将图片传至后台进行下一步检测。

    此项配置为离线采集SDK端的活体检测动作,可对动作数量及顺序进行配置。推荐采用随机顺序进行三个以上动作的校验。

    附录:

    质量控制参数 「宽松」 「正常」 「严格」
    光照最小值 30 40 60
    光照最大值 240 220 200
    遮挡-左眼 0.95 0.8 0.4
    遮挡-右眼 0.95 0.8 0.4
    遮挡-鼻子 0.95 0.8 0.4
    遮挡-嘴巴 0.95 0.8 0.4
    遮挡-左脸 0.95 0.8 0.4
    遮挡-右脸 0.95 0.8 0.4
    遮挡-下巴 0.95 0.8 0.4
    姿态-俯仰角 30 20 15
    姿态-左右角 18 18 15
    姿态-旋转角 30 20 15
    模糊度 0.8 0.6 0.4

    4.3 人脸实名认证API配置

    image.png
    • 人脸实名认证接口:增强级实名认证方案默认接入 增强级人脸实名认证API。在增强级APP方案中SDK会自动发起请求,但您需要在百度云控制台创建人脸识别应用,勾选增强级人脸实名认证API并开通付费
    • 安全加密能力:(增强级方案中默认开启此项功能,无需您自行配置)增强级APP方案集成文件中的采集SDK会对输出的图片进行加密,在云端增强级实名认证API进行解密。此端云配合的加密方式是百度专门针对市面黑产绕过采集SDK,攻击云端接口的攻击方式进行的功能升级。
    • 大数据风控:大数据风控功能开启后,接受SDK端传入的设备指纹信息,基于百度海量大数据设备因子,对SDK端进行设备风险识别,辨别是否为⻛险设备,返回识别结果。可有效防御黑产批量虚拟机、病毒侵入等攻击手段,降低第三方黑产攻破概率,提升业务安全性。
    • 图像质量检测:分为正常与宽松两个等级,等级设置越严格,对图片角度、模糊度、遮挡等信息参数把控越高,推荐使用宽松。
    • 活体检测:分为严格、正常、宽松三个等级,不同等级对应不同的活体检测阈值。等级设置越严格,对活体检测相关参数信息的把控越高。不同等级对应指标可参考下表,推荐使用正常。

    活体检测阈值:活体检测得分高于此阈值,即判断为活体

    误拒率(FRR):指误将活体用户判断为非活体的概率。如误拒率为0.5%,指1000次真人请求,会有5次因为活体分数低于阈值被错误拒绝。

    控制度 对应阈值 说明
    宽松 0.05 万分之一活体误拒率
    正常(推荐) 0.3 千分之一活体误拒率
    严格 0.9 百分之一活体误拒率
    • 阈值:用户人脸图片与公安权威数据源中人脸的相似度得分阈值,得分超过此阈值,即被判断为同一人。阈值分数相关指标可参考下表,推荐阈值为80。
    阈值分数 误识率 识别率
    60 0.781615% 99.550128%
    70 0.096534% 98.307626%
    78 0.015570%(万分之一) 95.672664%
    80 (推荐) 0.009342%(低于万分之一) 94.323051%

    Step5:提交方案,获取示例工程

    完成上述方案配置后,点击『提交』,进入方案管理页面,下载IOS/安卓版集成文件(含示例工程)进行SDK端集成使用。

    image.png

    Step4中方案配置的参数会自动生成至集成文件(含示例工程)中,方便开发使用。 注意:请谨慎修改APP方案流程,修改后需要重新下载集成文件进行使用。

    具体开发操作请参考以下步骤。

    二、 集成逻辑

    2.1 iOS集成

    2.1.1 运行Demo

    在真机上运行Demo代码并确认Demo本身可以正确进行人证核验

    Step 1: 打开上述步骤中下载的集成文件demo,如下图所示:

    Step 2: 确认demo中使用的bundleIdetifier是否为最终要使用的bundleIdetifier, 如果不对,则需要重新阅读上述文档,保证bundleIdetifier的正确性,也就是建方案的时候的iOS的包名,需要为自己工程的bundleIdetifer.

    Step 3: 修改:FaceParameterConfig.h文件中的FACE_API_KEY 和 FACE_SECRET_KEY

    Step 4: 真机运行demo代码,测试Demo

    Step 5: 一定要确认demo是可以正常进行人脸检测的,即进行身份证识别和人脸检测之后,真机可以运行,并可以人证核验成功,如下图所示:

    2.1.2 集成至目标工程

    Step 1: 新建工程,如下图所示:

    Step 2: 将上述demo中下载的BDFaceSDK文件夹和 AipOcrSdk.framework、AipBase.framework、IdcardQuality.frame三个framework拖动至目标工程中,如下图所示:

    移动完成后,如下所示:

    Step 3: 选择targets中的BuildPhases,点击下图所示的+号,然后选择New Copy File Phase,如下图所示

    Step 4: 双击Copy Files,将Copy Files改名为Embed Frameworks, 然后点击Copy Files前面的>号打开该项,修改Destination为Frameworks,如下图所示

    Step 5: 将工程中的AipOcrSdk.framework,AipBase.framework,IdcardQuality.framework三个framework,拖入Embed Frameworks中,如下图所示:

    Step 6: 添加依赖库 libz.tbd 和 libc++.tbd ,如下图所示:

    Step 7: 确认目标工程的bundleIdetifier和下载的示例工程的是一致的,同时也和申请授权标识license时填写的iOS包名是一致的。

    Step 8: 真机可顺利运行代码。

    2.1.3 代码说明

    2.1.3.1 OCR鉴权代码

    NSString *licenseFile = [[NSBundle mainBundle] pathForResource:FACE_API_ORC_KEY ofType:FACE_SECRET_OCR_KEY];
    NSData *licenseFileData = [NSData dataWithContentsOfFile:licenseFile];
    [[AipOcrService shardService] authWithLicenseFileData:licenseFileData];`

    2.1.3.2 人脸SDK使用鉴权

    [[SSFaceSDKManager sharedInstance] setBCEClientId:FACE_API_KEY clientSecret:FACE_SECRET_KEY];
    NSString* licensePath = [NSString stringWithFormat:@"%@.%@", FACE_LICENSE_NAME, FACE_LICENSE_SUFFIX ];
    [[SSFaceSDKManager sharedInstance] setLicenseID:FACE_LICENSE_ID andLocalLicenceFile:licensePath andRemoteAuthorize:YES];
    NSLog(@"canWork = %d",[[SSFaceSDKManager sharedInstance] canWork]);
    NSLog(@"version = %@",[[SSFaceSDKManager sharedInstance] getVersion]);`

    2.1.3.3 获取token代码

    ``[self getAccessTokenWithAK:FACE_API_KEY SK:FACE_SECRET_KEY];``

    2.1.3.4 初始化函数[[BDFaceActionLiveConfig sharedInstance] initSDK];

    函数内容如下:

    AppDelegate *appDelegate = (AppDelegate*) [[UIApplication sharedApplication] delegate];
    if (![[SSFaceSDKManager sharedInstance] canWork]){
        NSLog(@"授权失败,请检测ID 和 授权文件是否可用");
        return;
    }
    // 设置人脸遮挡阀值
    [[SSFaceSDKManager sharedInstance] setOccluThreshold:0.5];
    // 设置亮度阀值
    [[SSFaceSDKManager sharedInstance] setMinIllumThreshold:40];
    [[SSFaceSDKManager sharedInstance] setMaxIllumThreshold:240];
    // 设置图像模糊阀值
    [[SSFaceSDKManager sharedInstance] setBlurThreshold:0.3];
    // 初始化SDK配置参数,可使用默认配置
    // 设置最小检测人脸阈值
    [[SSFaceSDKManager sharedInstance] setMinFaceSize:200];
    // 设置截取人脸图片高
    [[SSFaceSDKManager sharedInstance] setCropFaceSizeWidth:400];
    // 设置截取人脸图片宽
    [[SSFaceSDKManager sharedInstance] setCropFaceSizeHeight:640];
    // 设置头部姿态角度
    [[SSFaceSDKManager sharedInstance] setEulurAngleThrPitch:10 yaw:10 roll:10];
    // 设置人脸检测精度阀值
    [[SSFaceSDKManager sharedInstance] setNotFaceThreshold:0.6];
    // 设置抠图的缩放倍数
    [[SSFaceSDKManager sharedInstance] setCropEnlargeRatio:2.5];
    // 设置照片采集张数
    [[SSFaceSDKManager sharedInstance] setMaxCropImageNum:3];
    // 设置超时时间
    [[SSFaceSDKManager sharedInstance] setConditionTimeout:15];
    // 设置开启口罩检测,非动作活体检测可以采集戴口罩图片
    [[SSFaceSDKManager sharedInstance] setIsCheckMouthMask:true];
    // 设置开启口罩检测情况下,非动作活体检测口罩过滤阈值,默认0.8 不需要修改
    [[SSFaceSDKManager sharedInstance] setMouthMaskThreshold:0.8f];
    // 设置原始图缩放比例
    [[SSFaceSDKManager sharedInstance] setImageWithScale:0.8f];
    // 设置图片加密类型,type=0 基于base64 加密;type=1 基于百度安全算法加密
    [[SSFaceSDKManager sharedInstance] setImageEncrypteType: 1];
    // 初始化SDK功能函数
    
    // 设置人脸过远框比例
    [[SSFaceSDKManager sharedInstance] setMinRect:0.4];
    
    // 设置图像阀值
    [BDFaceAdjustParamsTool changeConfig:appDelegate.faceImageParams];
    [[BDFaceActionLiveConfig sharedInstance] initActionLive];
    [[SSFaceSDKManager sharedInstance] initCollect];`

    2.1.3.5 设置动作函数

    [BDFaceLivingConfigModel.sharedInstance.liveActionArray addObject:@(FaceLivenessActionTypeLiveEye)];
    [BDFaceLivingConfigModel.sharedInstance.liveActionArray addObject:@(FaceLivenessActionTypeLiveMouth)];
    [BDFaceLivingConfigModel.sharedInstance.liveActionArray addObject:@(FaceLivenessActionTypeLiveYawRight)];
    BDFaceLivingConfigModel.sharedInstance.isByOrder = NO; // 动作是否是随机顺序
    BDFaceLivingConfigModel.sharedInstance.numOfLiveness = 3;`

    2.1.3.6 初始化SDK函数

    [[SSFaceSDKManager sharedInstance] initCollect];`

    2.1.3.7 活体检测状态的回调函数

    - (void)livenessActionDidFinishWithCode:(LivenessRemindCode)code;`

    2.1.3.8 人脸流程回调函数

    - (void)faceSessionCompletionWithStatus:(BDFaceCompletionStatus)status result:(NSDictionary *)result;`

    2.1.3.9 BDFaceCompletionStatus的状态

    BDFaceCompletionStatusSuccess = 1,
    BDFaceCompletionStatusNoRisk = 2, 
    BDFaceCompletionStatusImagesSuccess = 3,
    • 上述三个都是采集流程正常的回调,BDFaceCompletionStatusNoRisk表示设备没有风险。
    • BDFaceCompletionStatusSuccessBDFaceCompletionStatusImagesSuccess 的区别是:BDFaceCompletionStatusSuccess 代表着整个流程的完成,即人脸离线活体检测和最终人证核验流程的结束;而 BDFaceCompletionStatusImagesSuccess代表了动作采集流程完成,但最终的人证核验流程还没有完成。

    2.1.3.10 重要的开始人脸检测函数

    [[SSFaceSDKManager sharedInstance] livenesswithList:livenessArray order:order numberOfLiveness:numberOfLiveness];

    注意:进行人脸识别之前,需要先调用initCollect方法进行安全SDK初始化; 2.1.3.11 活体状态检测函数

    - (void)livenessActionDidFinishWithCode:(LivenessRemindCode)code;

    活体检测状态,如引导用户张嘴,转头都在这个回调里,具体看BDFaceLivenessViewController即可。 2.1.3.12 开始人脸识别函数

    - (void)startRecognize {
    [[BDFaceImageShow sharedInstance] setSuccessImage:nil];
    NSDictionary *parameters =  [self.videoCapture creatFaceVerifyParameters:self.idCardNumber name:self.name verifyType:KFaceIdCardTypeDefault nation:nil phoneNumber:nil livenessControl:nil spoofingControl:nil qualityControl:nil];
    [self.videoCapture startSessionWithType:BDFaceResultReportTypeVerifySec parameters:parameters faceFlow:self.faceFlowType viewController:self];
    }

    注意:上述函数中 参数: self.idCardNumber 是身份证号信息,self.name是姓名信息

    2.1.4 SDK相关头文件介绍

    2.1.4.1 SSFaceSDK.h

    包含其他头文件,及人脸扫描、活体验证状态码,同时还有执行业务流程的参数枚举等。此处没有一一列举,具体请参照头文件:

    #import "SSFaceSDKManager.h"
    #import "SSFaceDetectionManager.h"
    // 参数枚举等
    typedef NSString *FaceIdCardType NS_STRING_ENUM;
    FOUNDATION_EXPORT FaceIdCardType const KFaceIdCardTypeDefault; // 默认 大陆身份证
    FOUNDATION_EXPORT FaceIdCardType const KFaceIdCardTypeMTPIDCard; // 港澳居民来往内地通行证
    FOUNDATION_EXPORT FaceIdCardType const KFaceIdCardTypeFPRIDCard; // 外国人永久居留身份证
    FOUNDATION_EXPORT FaceIdCardType const KFaceIdCardTypePassport; // 定居国外的中国公民护照
    
    // 活体检测返回状态
    typedef NS_ENUM(NSUInteger, LivenessRemindCode) {
    LivenessRemindCodeOK = 0,   //成功
    LivenessRemindCodeBeyondPreviewFrame,    //出框
    LivenessRemindCodeNoFaceDetected, //没有检测到人脸
    LivenessRemindCodeMuchIllumination,
    LivenessRemindCodePoorIllumination,   //光照不足
    LivenessRemindCodeImageBlured,    //图像模糊
    ...

    2.1.4.2 SSFaceSDKManager.h

    图像采集行为和过程中需要的设置,属于全局配置。在原IDL库中FaceSDKManager基础上增加如下两个接口:

    /**
     *  SDK云端校验设置
     *  需要云端校验,需提前申请id和secret
     *
     *  @param clientId api key
     *  @param clientSecret api secret
     */
    - (void)setBCEClientId:(NSString *)clientId clientSecret:(NSString *)clientSecret;
    
    
    /**
     * 设置活体动作
     * @param array 包含活体动作种类
     * @param order 是否顺序执行
     * @param numberOfLiveness 活体数量
     */
    - (void)livenesswithList:(NSArray *)array order:(BOOL)order numberOfLiveness:(NSInteger)numberOfLiveness;

    2.1.4.3 SSFaceDetectionManager.h

    用于进行人脸识别具体行为动作。

    @interface SSFaceDetectionManager : NSObject
    // 图像返回帧处理代理
    @property (nonatomic, weak) id<SSCaptureDataOutputProtocol> delegate;
    
    // 采集流程运行状态
    @property (nonatomic, assign, readonly) BOOL runningStatus;
    
    // 风险检测超时时间:-1 关闭风险检测;大于0 风险检测超时时间;0 使用默认超时时间3秒
    @property (nonatomic, assign) NSInteger riskDetectionSetting;
    
    // 设置使用镜头,前置/后置
    @property (nonatomic, assign) AVCaptureDevicePosition devicePosition;
    
    // 输出形式,AVCaptureSessionPreset类型
    @property (nonatomic, copy) NSString *sessionPresent;
    
    // 采集图像区域
    @property (nonatomic, assign) CGRect previewRect;
    
    // 探测区域
    @property (nonatomic, assign) CGRect detectRect;
    
    // 是否开启声音提醒
    @property (nonatomic, assign) BOOL enableSound;
    
    
    /**
     * 创建用于实名认证的参数
     */
    - (NSDictionary *)creatFaceVerifyParameters:(NSString *)idCardNumber
                                       name:(NSString *)name
                                 verifyType:(FaceIdCardType)cardType
                                     nation:(NSString *)nation
                                phoneNumber:(NSString *)phoneNumber
                            livenessControl:(FaceLivenessControlType)livenessControl
                            spoofingControl:(FaceSpoofingControlType)spoofingControl
                             qualityControl:(FaceQualityControlType)qualityControl;
    
    /**
     * 创建用于人脸比对的参数
     */
    - (NSDictionary *)createFaceMatchParametersWithRegisterImage:(NSString *)registerImageBase64
                                           registerImageType:(FaceRegisterImageType)registerImageType
                                            registerFaceType:(FaceFaceType)registerFaceType
                                                    faceType:(FaceFaceType)faceType
                                                faceSortType:(FaceSortype)faceSortType
                                                 phoneNumber:(NSString *)phoneNumber
                                             livenessControl:(FaceLivenessControlType)livenessControl
                                              qualityControl:(FaceQualityControlType)qualityControl
                                     registerLivenessControl:(FaceLivenessControlType)registerLivenessControl
                                      registerQualityControl:(FaceQualityControlType)registerQualityControl;
    
    
    /**
     * 开始当前人脸校验流程
     * @param detectionType 业务流程,采集信息用于实名认证、人脸比对
     * @param parameters 流程需要的参数
     * @param flowType 操作流程,人脸采集、人脸活体
     * @param vc 用于进行人脸信息采集的ViewController
     */
    - (void)startSessionWithType:(BDFaceResultReportType)detectionType parameters:(NSDictionary *)parameters faceFlow:(BDFaceFlowType)flowType viewController:(UIViewController *)vc;
    
    /**
     * 取消当前人脸校验流程
     */
    - (void)cancel;
    通过startSession方法开始进行人脸采集之后,会通过SSCaptureDataOutputProtocol类型的delegate进行回调:
    
    /**
     * 流程返回结果类型
     */
    typedef NS_ENUM(NSInteger, BDFaceCompletionStatus) {
    BDFaceCompletionStatusSuccess = 1,  // 成功
    BDFaceCompletionStatusNoRisk = 2,   // 无风险
    BDFaceCompletionStatusImagesSuccess = 3, // 图像采集成功
    
    BDFaceCompletionStatusIsRunning = -1,   // 正在采集图像
    BDFaceCompletionStatusResultFail = -2,  // 云端服务执行失败
    BDFaceCompletionStatusIsRiskDevice = -3,    // 风险设备
    BDFaceCompletionStatusCameraError = -5,    // 没有授权镜头
    BDFaceCompletionStatusTimeout = -6, // 超时
    BDFaceCompletionStatusSDKNotInit = -13, // SDK未初始化
    BDFaceCompletionStatusLicenseFail = -15, // 授权错误
    BDFaceCompletionStatusNetworkError = -16,    // 网络错误
    };
    
    @protocol SSCaptureDataOutputProtocol <NSObject>
    
    // 帧图像回传,用于刷新UI使用
    - (void)captureOutputSampleBuffer:(UIImage *)image;
    
    // 本次人脸流程回调
    - (void)faceSessionCompletionWithStatus:(BDFaceCompletionStatus)status result:(NSDictionary *)result;
    
    // 活体检测状态
    - (void)livenessActionDidFinishWithCode:(LivenessRemindCode)code;
    
    // 人脸识别检测
    - (void)detectionActionDidFinishWithCode:(DetectRemindCode)code;
    
    @end

    2.2 安卓集成

    2.2.0 运行demo

    (1)替换AK、SK

    AK/SK获取方式请参考这里

    (2)替换签名

    运行成功后,如下图所示。

    2.2.1 资源准备

    将申请得到的以下文件放到app module 下的assets目录中

    1. aip.license //OCR 身份证识别的license,不能修改该文件名
    2. console_config.json //人脸识别的配置
    3. idl-key.face-android //LH 加固版人脸采集的密钥,不能修改该文件名
    4. idl-license.face-android //FACESDK的license

    备注 :以下列举几个关键流程,完整流程请参考下载示例代码

    2.2.2 OCR身份证识别集成

    • 把申请的license(aip.license)放到到项目中app module下的assets目录中
    • 修改app的build.gradle包名为申请时填入的包名 img
    • 拷贝ocr-ui到您的工程中

    接下来调用具体请看示例工程

    Step 1:在首页面初始化OCR SDK(在HomeActivity.java中)

    private void initOCRSDK() {
            OCR.getInstance(this).initAccessToken(new OnResultListener<AccessToken>() {
                @Override
                public void onResult(final AccessToken result) {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            // 调用成功,返回AccessToken对象
                            String token = result.getAccessToken();
                        }
                    });
                }
    
                @Override
                public void onError(final OCRError error) {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            //调用失败
                            Log.d(TAG, "run: erromsg=" + error.getMessage());
                        }
                    });
    
                }
            }, getApplicationContext());
        }

    Step 2: 跳转至身份证扫描页面进行身份证扫描(在HomeActivity.java中)

     /**
         * 开始进入身份证认证页面
         */
        private void startIdCardVerify() {
            if (mConsoleConfig.getUseOcr() == 1) {
                Intent intent = new Intent(mContext, CameraExpActivity.class);
                // 设置临时存储
                intent.putExtra(CameraActivity.KEY_OUTPUT_FILE_PATH,
                        FileUtil.getSaveFile(getApplication()).getAbsolutePath());
                // 调用拍摄身份证正面的activity
                intent.putExtra(CameraActivity.KEY_CONTENT_TYPE, CameraActivity.CONTENT_TYPE_ID_CARD_FRONT);
                intent.putExtra(CameraActivity.KEY_NATIVE_TOKEN, OCR.getInstance(this).getLicense());
                intent.putExtra(CameraActivity.KEY_NATIVE_ENABLE, true);
                startActivity(intent);
            } else {
                Intent intent = new Intent(mContext, IdCardInputActivity.class);
                startActivity(intent);
            }
        }

    Step 3:调用身份证识别请求接口api进行身份证识别(在IdCardRecognizeActivity.java中)

    其中请求参数如下:

    请求参数 说明
    image 身份证扫描的图像
    id_card_side 身份证的正反面类型
    detect_risk 是否开启旋转识别
    /**
         * 识别身份证
         */
        private void recIDCard(String idCardSide, final String filePath) {
            IDCardParams param = new IDCardParams();
            param.setImageFile(new File(filePath));
            param.setIdCardSide(idCardSide);
            param.setDetectDirection(true);
            OCR.getInstance(this).recognizeIDCard(param, new OnResultListener<IDCardResult>() {
                @Override
                public void onResult(final IDCardResult result) {
                        runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            if (result == null) {
                                return;
                            }
                            //识别成功获取值
                            Word idNumber = result.getIdNumber();
                            Word nameWord = result.getName();
                            if (idNumber != null) {
                                mIdCardNum = idNumber.getWords();
                            }
    
                            if (nameWord != null) {
                                mUsername = nameWord.getWords();
                            }
                        }
                    });
                }
    
                @Override
                public void onError(final OCRError error) {
                    //识别失败
                }
            });
        }

    Step 4: 获得身份证号码和姓名后进入人脸活体验证步骤

    详细调用文档,请参考 OCR-Android-SDK文档

    2.2.3 人脸SDK集成

    Step 1: 授权参数

    (1)导入如下module

    • 拷贝faceplatform-ui到您的工程中
    • 拷贝lib-liantian到您的工程中

    (2)把申请的license(idl-license.face-android","idle-key.face-android")放到到项目中app module下的assets目录中(console_config.json 为示例工程配置,开发者可更换配置方案)

    (3)修改 Config.java 类中的参数

    人脸实名认证控制台创建完APP方案后,会自动生成LicenseID和LicenseFileName信息,这里您只需要填写apiKey和secretkey信息即可。

    public class Config {
        // 为了apiKey,secretKey为您调用百度人脸在线接口的,如注册,比对等。
        // 为了的安全,建议放在您的服务端,端把人脸传给服务器,在服务端端
        // license为调用sdk的人脸检测功能使用,人脸识别 = 人脸检测(SDK功能)+ 人脸比对(服务端API)
        public static String apiKey = "替换为你的apiKey(ak)";
        public static String secretKey = "替换为你的secretKey(sk)";
        public static String licenseID = "替换为你的licenseID,后台SDK管理界面中,已经生成的licenseID,如:test-face-android";
        public static String licenseFileName = "替换为你的license文件名称(放于assets目录)";
    }

    (4)配置签名(申请license时的md5为打包签名的文件,所以必须用申请license的签名文件

    app->build.gradle->android->signingConfigs
    signingConfigs {
            def password = "替换为签名密码"
            def alias = "替换为签名别名"
            def filePath = "替换为签名文件路径"  //如  ../facesharp.jks//签名文件路径
            debug {
                keyAlias alias
                keyPassword password
                storeFile file(filePath)
                storePassword(password)
            }
            release {
                keyAlias alias
                keyPassword password
                storeFile file(filePath)
                storePassword(password)
            }
        }

    (5)修改包名 app->build.gradle->android->defaultConfig ->applicationId您申请license时填的包名

    img

    Step 2:初始化人脸相关SDK

    ExampleApplication中初始化LH安全加固人脸采集类

     private void initLH() {
            LH.setAgreePolicy(getApplicationContext(), true);
            LH.init(getApplicationContext(),
                    Config.licenseID,
                    Config.apiKey,
                    Config.secretKey);
    
        }

    HomeActivity.java中初始化FaceSDK

    private void initLicense() {
        setFaceConfig();
        // 为了android和ios 区分授权,appId=appname_face_android ,其中appname为申请sdk时的应用名
        // 应用上下文
        // 申请License取得的APPID
        // assets目录下License文件名
        FaceSDKManager.getInstance().initialize(mContext, 
        Config.licenseID, Config.licenseFileName, new IInitCallback() {
                @Override
                public void initSuccess() {
                // 初始化OCR SDK 使用的license是aip.license,名字不能修改
                    initOCRSDK();
                }
    
                @Override
                public void initFailure(final int errCode, 
                final String errMsg) {
                    runOnUiThread(new Runnable() {
                       @Override
                       public void run() {
                           Log.e(TAG, "初始化失败 = " + errCode + " " + errMsg);
                           showToast("初始化失败 = " + errCode + ", " + errMsg);
                           mIsInitSuccess = false;
                       }
                    });
                }
            });
        }

    Step 3:设置配置参数,如不设置,将使用默认值(在 HomeActivity.java中)

        /**
         * 参数配置方法
         */
        private boolean setFaceConfig() {
            FaceConfig config = FaceSDKManager.getInstance().getFaceConfig();
            mConsoleConfig = ConsoleConfigManager.getInstance(mContext).getConfig();
            if (mConsoleConfig == null) {
                return false;
            }
            // -----TODO:以下为通过console平台获取到的配置信息-----
            // 设置模糊度阈值
            config.setBlurnessValue(mConsoleConfig.getBlur());
            // 设置最小光照阈值(范围0-255)
            config.setBrightnessValue(mConsoleConfig.getIllumination());
            // 设置最大光照阈值(范围0-255)
            config.setBrightnessMaxValue(mConsoleConfig.getMaxIllumination());
            // 设置左眼遮挡阈值
            config.setOcclusionLeftEyeValue(mConsoleConfig.getLeftEyeOcclu());
            // 设置右眼遮挡阈值
            config.setOcclusionRightEyeValue(mConsoleConfig.getRightEyeOcclu());
            // 设置鼻子遮挡阈值
            config.setOcclusionNoseValue(mConsoleConfig.getNoseOcclu());
            // 设置嘴巴遮挡阈值
            config.setOcclusionMouthValue(mConsoleConfig.getMouthOcclu());
            // 设置左脸颊遮挡阈值
            config.setOcclusionLeftContourValue(mConsoleConfig.getLeftCheekOcclu());
            // 设置右脸颊遮挡阈值
            config.setOcclusionRightContourValue(mConsoleConfig.getRightCheekOcclu());
            // 设置下巴遮挡阈值
            config.setOcclusionChinValue(mConsoleConfig.getChinOcclu());
            // 设置人脸姿态角阈值
            config.setHeadPitchValue(mConsoleConfig.getPitch());
            config.setHeadYawValue(mConsoleConfig.getYaw());
            config.setHeadRollValue(mConsoleConfig.getRoll());
            // 设置活体动作,通过设置list,LivenessTypeEunm.Eye, LivenessTypeEunm.Mouth,
            // LivenessTypeEunm.HeadUp, LivenessTypeEunm.HeadDown, LivenessTypeEunm.HeadLeft,
            // LivenessTypeEunm.HeadRight, LivenessTypeEunm.HeadLeftOrRight
            config.setLivenessTypeList(mConsoleConfig.getActions());
            // 设置动作活体是否随机
            config.setLivenessRandom(mConsoleConfig.isFaceVerifyRandom());
            // 风控加密类型,0:普通版;1:加密版
            config.setSecType(mConsoleConfig.getSecType());
    
            // -----TODO:以下不需要通过console平台配置,需要手动修改-----
            // 设置可检测的最小人脸阈值
            config.setMinFaceSize(FaceEnvironment.VALUE_MIN_FACE_SIZE);
            // 设置可检测到人脸的阈值
            config.setNotFaceValue(FaceEnvironment.VALUE_NOT_FACE_THRESHOLD);
            // 设置闭眼阈值
            config.setEyeClosedValue(FaceEnvironment.VALUE_CLOSE_EYES);
            // 设置图片缓存数量
            config.setCacheImageNum(FaceEnvironment.VALUE_CACHE_IMAGE_NUM);
            // 设置开启提示音
            config.setSound(ExampleApplication.isOpenSound);
            // 原图缩放系数
            config.setScale(FaceEnvironment.VALUE_SCALE);
            // 抠图宽高的设定,为了保证好的抠图效果,建议高宽比是4:3
            config.setCropHeight(FaceEnvironment.VALUE_CROP_HEIGHT);
            config.setCropWidth(FaceEnvironment.VALUE_CROP_WIDTH);
            // 抠图人脸框与背景比例
            config.setEnlargeRatio(FaceEnvironment.VALUE_CROP_ENLARGERATIO);
            // 选择针对人脸采集输出图片的类型进行加密,0:原图,1:抠图
            config.setOutputImageType(FaceEnvironment.VALUE_OUTPUT_IMAGE_TYPE);
            // 检测超时设置
            config.setTimeDetectModule(FaceEnvironment.TIME_DETECT_MODULE);
            // 检测框远近比率
            config.setFaceFarRatio(FaceEnvironment.VALUE_FAR_RATIO);
            config.setFaceClosedRatio(FaceEnvironment.VALUE_CLOSED_RATIO);
            FaceSDKManager.getInstance().setFaceConfig(config);
            return true;
        }

    Step 4:开始进行人脸采集

    1. IdCardConfirmActivity.java 采集到身份证号码和姓名后开始进行人脸活体采集
        public static final String EXT_USERNAME = "username";
        public static final String EXT_ID_NUMBER = "idNumber";
    
        // 调转到动作活体采集界面
        faceIntent.setClass(this, FaceLivenessExpActivity.class);
        faceIntent.putExtra(EXT_USERNAME, mUsername);
        faceIntent.putExtra(EXT_ID_NUMBER, mIdNumber);
        startActivity(faceIntent);

    2 . 采集过程中设置语音开关

    //设置是否开启语音
    LH.setSoundEnable(mIsEnableSound);

    3 .开启预览,示例A为开始实名认证流程,如只进行人脸比对流程则在开启预览时替换为示例B人脸对比方法即可

    示例A,开始实名认证流程

    protected void startPreview() {
            if (mSurfaceView != null && mSurfaceView.getHolder() != null) {
                mSurfaceHolder = mSurfaceView.getHolder();
            }
            Log.d(TAG, "name=" + sName + " ,idNumber=" + sIdNumber);
            LH.startFaceVerify(this, mSurfaceHolder, this, 5, new FaceVerifyInfo
                    (sIdNumber, sName, 0, "CHN", FaceEnum.LivenessControl.NONE,
                            FaceEnum.SpoofingControl.NONE,
                            FaceEnum.QualityControl.NONE, ""), true);
    
    
        }

    实名认证参数说明:

    activity:执行人脸采集的Activity。

    previewSurfaceHolder:用于展示摄像头预览的SurfaceView的Holder。
    processCallback:流程回调,见“FaceProcessCallback接口”。
    deviceCheckTimeout:安全检测超时时间,传入正数时,若在该时间内(单位:秒)未完成检测,则跳过。传入-1跳过检测,传入0后台检测。
    info:实名认证信息,包含身份证号,姓名等信息。
    liveness:是否进行活体检测。

    示例B,开始人脸对比流程

     String image=Base64Utils.encodeToString(
            getImageFromAssetsFile(getApplicationContext(),"ceshi.jpg"),Base64Utils.NO_WRAP);
    
    LH.startFaceCompare(this, mSurfaceHolder, this, 5, new FaceCompareInfo
            (FaceEnum.QualityControl.NONE, FaceEnum.LivenessControl.NORMAL,
                    FaceEnum.FaceType.LIVE,0,
                    image,FaceEnum.ImageType.BASE64,FaceEnum.FaceType.LIVE,
                    FaceEnum.QualityControl.NORMAL, FaceEnum.LivenessControl.NORMAL,""), true);
    //获取assets目录下的图片             
    public static byte[] getImageFromAssetsFile(Context context, String fileName) {
        byte[] result = null;
        AssetManager am = context.getResources().getAssets();
        try {
            InputStream is = am.open(fileName);
            result=new byte[is.available()];
            is.read(result);
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }

    人脸对比参数说明:

    activity:执行人脸采集的Activity。

    previewSurfaceHolder:用于展示摄像头预览的SurfaceView的Holder。
    processCallback:流程回调,见“FaceProcessCallback接口”。
    deviceCheckTimeout:安全检测超时时间,传入正数时,若在该时间内(单位:秒)未完成检测,则跳过。传入-1跳过检测,传入0后台检测。
    info:人脸比对信息,包含比对用图片等信息。
    liveness:是否进行活体检测。

    4 .建议在 Activity.onPause()放方法中取消正在进行的流程

     
        @Override
        public void onPause() {
            if (!mIsCompletion) {
                LH.cancelFaceProcess();
            }
            mIsCompletion = false;
            super.onPause();
        }

    取消正在进行的人脸比对或实名认证流程。安全SDK取消整个流程。请在Activity的onPause中调用此方法,保证界面离开顶端时流程被取消。下次进入界面应当重新开始人脸验证过程。调用此接口后,调用后LH 的onEnd()回调会返回-6错误码。属于正常现象。

    5 . 获取校验结果

       
        @Override
        public void onEnd(final int status, String resultJson) {
            Log.e("FaceLivenessActivity", "onEnd called:" + status + "_" + resultJson);
            if (status == 1) {
                //流程正常结束
            } else {
                //流程异常结束
            }
        }

    获取校验结果API接口参数说明

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

    resultJson:云端返回的结果。只有status为1时此字段有值。其他情况为空字符串。

    onEnd的部分status值列举如下

    1:正常结束,返回云端验证结果。

    -1:已经有一个采集验证流程在运行。

    -2:云端验证过程异常。

    -3:风控验证失败。

    -4:更严格情形下的风控验证失败。

    -5:摄像头异常。

    -6:流程被取消。

    -7:线程异常。

    -8:筛选图像异常。

    -9:采集前流程异常。

    -10:活体验证步骤异常。

    -11:预览异常。

    -12:采集后流程异常。

    -13:未初始化Liantian安全SDK。

    -14:未同意隐私协议。

    -15:未成功加载安全模块。

    -18:未检出人脸超时。

    -19:网络异常。

    更多LH 接口信息点击 安全采集SDKAPI 接口

    上一篇
    方案简介
    下一篇
    增强级H5端实名认证方案