方案集成指南
本文档介绍了增强级APP实名认证方案配置流程,以及APP集成开发流程。
一、 准备工作
在正式集成前,需要做一些准备工作,完成一些账号、应用及配置,具体如下:
Step1: 注册成为开发者
在使用百度人脸实名认证方案之前,首先需注册百度云账号,账号注册方式请参考账号注册指南。
百度云账号注册完成以后,为顺利调用百度AI能力,需完成企业认证。具体认证方式请参考企业认证指南。
Step2:创建应用
2.1 输入应用名称,领取免费额度
-
创建好账号后,在正式调用AI 能力之前,需首先创建应用,应用是调用服务的基础能力单元。 同时领取接口所需的免费调用额度,用于接入测试。如下图所示:
- 除人脸服务接口的免费调用额度外,还需领取身份证识别接口的免费调用额度,用来调用身份证OCR识别功能(必须领取,否则会报错服务异常),点击此处,按下图所示进行领取。
- 如您之前已经领取过免费额度,无需重复领取,请跳至下一步骤。
2.2 勾选所需接口
-
人脸识别服务相关接口已默认勾选且不可取消。
- 注:「接口选择」过程中,还需勾选「文字识别」中的「身份证识别」接口,用于实现身份核验流程中的身份证识别功能。如下图所示。
2.3 输入应用包名
- 在「文字识别包名」处选择「需要」,并根据您的APP应用信息填写包名。此处为必要操作,否则将无法顺利下载集成文件。至此应用创建完成。
2.4 获取密钥信息(AK/SK)
完成应用创建后,平台将会分配给您此应用的相关凭证,主要为AppID、API Key、Secret Key,以上三个信息是您应用实际开发的主要凭证,每个应用之间各不相同,请您妥善保管。您可在控制台的应用管理页面找到以上信息。如下图所示
该AK/SK用于调用在线API 如:身份验证。在之后下载的集成文件(示例工程)中需要填写正确的AK/SK以顺利集成。
注:开发中请注意区分多份AK/SK(API Key、Secret Key),若填写的AK/SK与开发的应用不对应,会产生鉴权错误。
Step3:创建项目
- 进入控制台-人脸实名认证页面,选择『项目管理』页面,点击『新建项目』,进行项目创建,如下图所示。
创建项目前,请确保您在应用控制台已创建应用,若您未创建应用,请参考STEP2创建应用后,再进行项目创建.
Step4:创建方案
- 项目创建完成后,点击「方案管理」进入方案管理页面,在这里您可以为您的项目创建不同的方案,如下图所示。
若您的场景为APP场景(安卓/IOS系统),『场景方案』请选择APP实名认证方案;
若您的场景为微信、H5页面,『场景方案』请选择H5实名认证方案。
4.1 身份信息录入
- 身份信息录入支持选择用户手动输入或OCR拍照采集,如下图所示
OCR拍照采集:会在之后生成的APP集成文件内集成OCR采集SDK,在本地进行身份证质量校验,并判断是否为身份证证件。 (OCR拍照采集支持实时采集和相册上传两种形式。推荐您使用实时采集,可以在一定程度增加方案的安全性及便捷性。)
手动输入:支持用户手动输入姓名+身份证号信息。
4.2 离线采集SDK配置
- 填写授权标识:选择SDK的授权标识信息。
若您还未申请授权标识信息,请点击『新建授权』,并填写相关信息进行申请,申请过程如下图所示。
- 图像质量控制(本地):分为严格、正常、宽松三个等级,等级越严格,对采集图片的角度、模糊度、遮挡等信息参数把控越高,推荐使用正常。
此项配置为离线采集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配置
- 人脸实名认证接口:增强级实名认证方案默认接入 增强级人脸实名认证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端集成使用。
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表示设备没有风险。
- BDFaceCompletionStatusSuccess 和 BDFaceCompletionStatusImagesSuccess 的区别是: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目录中
- aip.license //OCR 身份证识别的license,不能修改该文件名
- console_config.json //人脸识别的配置
- idl-key.face-android //LH 加固版人脸采集的密钥,不能修改该文件名
- idl-license.face-android //FACESDK的license
备注 :以下列举几个关键流程,完整流程请参考下载示例代码
2.2.2 OCR身份证识别集成
- 把申请的license(aip.license)放到到项目中app module下的assets目录中
- 修改app的build.gradle包名为申请时填入的包名
- 拷贝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时填的包名
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:开始进行人脸采集
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 接口