安卓活体SDK接入指南 - v6.2.2
一、 概要
1.1、 简介
Android 活体检测SDK 是一个 Android 端活体检测解决方案,将真实人脸与照片、视频等假冒人脸区分开,有效防止假冒攻击。
目前SDK支持最低版本minSdkVersion 18;
目前SDK不提供开放下载,获取SDK包请联系 market@linkface.cn
1.2、技术原理
活体检测技术是由人脸检测、动作分析和人脸图像采集三部分组成。
人脸检测、定位及捕捉:系统从摄像头拍摄画面中利用算法找出人脸位置,进行定位,再根据其特征值估算出人脸的大小,然后进行分割。
人脸动作分析:通过眨眼、张嘴、上下点头、左右摇头等主动式交互动作,分析是否为活人。
人脸图片采集:在交互动作(眨眼、张嘴、上下点头、左右摇头等)的同时采集高质量人脸图片。
1.3、活体流程
二、集成步骤
2.1、活体SDK项目结构目录与准备工作
- 必要的用户权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
- build.gradle配置
把提供的liveness-release.aar和tensorflowcore-release.aar文件拷贝到项目主module的libs目录下。
在build.gradle文件中加入如下配置
implementation(name: 'liveness-release', ext: 'aar')
implementation(name: 'tensorflowcore-release', ext: 'aar')
为防止资源文件被压缩,在项目主module的build.gradle android标签下加入如下配置
aaptOptions {
noCompress "model"
}
重新build即可
2.2 活体调用流程
1、获取token
在拉起活体之前,需要先从客户服务器获取token,然后用token拉起活体识别页面。具体逻辑在demo中有示例。
2、配置活体参数,开发者可根据业务需求对活体参数做相应的配置
// 定义动作序列
ArrayList<LFLivenessMotion> motionList = new ArrayList<>();
motionList.add(LFLivenessMotion.BLINK);
motionList.add(LFLivenessMotion.OPEN_MOUTH);
motionList.add(LFLivenessMotion.NOD_HEAD);
motionList.add(LFLivenessMotion.SHAKE_HEAD);
// 选择难度模式
LFLivenessComplexity complexity = LFLivenessComplexity.HARD;
// 多图和单图模式
LFLivenessOutputType outputType = LFLivenessOutputType.MULTI_IMAGE;
// 是否保存视频
boolean isOutputVideo = true;
// 是否打开语音
boolean isOpenSound = true;
builder = new LFLivenessBuilder(MainTestActivity.this)
.setToken(token)
.setMotionList(motionList)
.setComplexity(complexity)
.setOutputType(outputType)
.setOutputVideo(isOutputVideo)
.setOpenSound(isOpenSound);
3.开启人脸识别
开发者根据LFLivenessManager的回调做对应的业务处理。活体SDK回调的result中包含了动作照片、动作视频地址(文件目录)和活体数据
LFLivenessManager.getInstance().startDetect(builder, new LFLivenessListener() {
@Override
public void onDetectStart() {
}
@Override
public void onDetectFinish(LivenessResult result) {
if (result == null) {
return;
}
switch (result.getErrorCode()) {
case LivenessResult.CODE_SUCCESS: //成功
requestHack(result.getData());
break;
case LivenessResult.CODE_CANCEL: // 取消
// do someThing
break;
}
}
});
4、安全hack
前端的活体检测只能保证动作的连续性,只能做到初步的防欺诈。 因为客户务必调用hack接口,以保证安全。详细用法参照demo.
5、错误码
错误码 | 描述 |
---|---|
1000 | 活体sdk成功 |
1001 | 取消 |
1002 | token失效 |
1003 | 重复调用 |
1004 | 活体异未知错误 |
1006 | 应用不在前台 |
1007 | 出现多个人脸,检测中断 |
1008 | 没有识别到人脸 |
1009 | 活体检测超时 |
1010 | 出现cpu架构不支持 |
三、减小包大小
1.动态加载SO(因每个APP所选用的abi架构不同,使用动态加载时,请联系我们的商务。)
如Demo所示,在LivenessActivity的onCreate()方法中,动态加载so库。
DynamicSO.loadSoFile(this, livenessSrc);
livenessSrc为资源包的sd卡地址,客户可在应该启动时或合适的时机把资源包解压到sd卡。 注意:由于Android的特殊性,宿主APP一旦设定了固定的ABI,则需要修改DynamicSO中的加载逻辑。
2.动态加载识别模型
DetectorOptions options = new DetectorOptions();
options.setContext(this);
options.setLivenessSrc(livenessSrc);
同样把资源包的地址传给DetectorOptions,识别模型会自动处理,并正确访问该资源
四、国际化
使用本SDK到其他的语言环境中,可以使用如下方式让活体页面展示您需要的语言。
SDK默认使用中文(如下图):
您可以在活体开始之前,调用LivenessString.reset()方法覆盖中文字符串。