动作活体
1. 动作活体 SDK 说明文档
1.1 简介
Android 动作活体检测SDK 是一个 Android 端活体检测解决方案,将真实人脸与照片、视频等假冒人脸区分开,有效防止假冒攻击。
1.2 使用流程
1.3 Anti-hack流程
Mobile SDK
: 您需要首先将它集成到自己的应用中, 这将会帮助您获取人脸图片. 阅读 SDK Integration 来快速集成.Server API
: 它会帮助你判断你上传的加密数据是否是真实的人脸,参考 Server API . 在动作活体SDK中我们需要实现这个api开启 anti-hack
1.4 当前版本
活体 SDK 当前最新版本是v2.0.1,2020年2月25日更新。
支持架构armeabi-v7a,arm64-v8a
sdk双架构编译增量5.3M,armeabi-v7a编译增量4.7M,arm64-v8a编译增量4.8M
最低支持系统版本Android4.2
2. 活体 SDK 集成说明
2.1 注意事项
license文件(DFLicense)用以控制程序的包名和有效时间(时间范围可以直接查看文件内容获取),请用户一定要确认程序的包名是否与 license 绑定的包名一致,请确保程序运行设备的系统时间在 license 的有效时间内。
2.2 SDK目录结构
2.3 将SDK集成到开发环境
使用SDK前,首先需要将其集成到您的开发环境中。
1,将DFLivenessActionDemo下的module模块DFLivenessLibrary以module的方式导入工程,通过File->New>importModule->选中DFLivenessActionDemo文件夹下的DFLivenessLibrary->连续点击Next完成导入。
2,在新建应用的根目录下面的builde.gradle下添加
repositories {
flatDir {
dirs project(':DFLivenessLibrary').file('libs')
}
}
在build.gradle中的dependencies{}中添加
compile project(':DFLivenessLibrary')
修改如下
allprojects {
repositories {
google()
jcenter()
flatDir {
dirs project(':DFLivenessLibrary').file('libs')
}
}
}
dependencies {
compile project('DFLivenessLibrary')
}
3,将DFLivenessActionDemo工程中DFLivenessSample的assets目录下的所有文件拷贝到您的工程中的assets目录下。
2.4 开始检测
使Application实现DFTransferResultInterface接口
public class MyApplication extends Application implements DFTransferResultInterface {
private DFProductResult mResult;
@Override
public void setResult(DFProductResult result) {
mResult = result;
}
@Override
public DFProductResult getResult() {
return mResult;
}
}
跳转检测界面
Bundle bundle = new Bundle();
// OUTPUT_TYPE 配置, 现在可以为Constants.MULTIIMG(多图),或者是Constants.VIDEO(视频)
bundle.putString(LivenessActivity.OUTTYPE,Constants.MULTIIMG);
//EXTRA_MOTION_SEQUENCE 动作检测序列配置,支持五种检测动作, STILL(静止), BLINK(眨眼), MOUTH(张嘴), NOD(点头), YAW(摇头), 各个动作以空格隔开。 第一个动作必须为HOLD_STILL。默认配置为"STILL BLINK MOUTH NOD YAW"
注意至少包含两个动作,其中一个是STILL
bundle.putString(DFActionLivenessActivity.EXTRA_MOTION_SEQUENCE, "STILL BLINK MOUTH NOD YAW");
bundle.putString(DFActionLivenessActivity.KEY_ANTI_HACK, true);
Intent intent = new Intent();
intent.setClass(this, DFActionLivenessActivity.class);
intent.putExtras(bundle);
//设置返回图片结果
intent.putExtra(DFActionLivenessActivity.KEY_DETECT_IMAGE_RESULT, true);
intent.putExtra(DFActionLivenessActivity.KEY_HINT_MESSAGE_HAS_FACE, “请保持静止”);
intent.putExtra(DFActionLivenessActivity.KEY_HINT_MESSAGE_NO_FACE, “请将人脸置入圈中”);
intent.putExtra(DFActionLivenessActivity.KEY_HINT_MESSAGE_FACE_NOT_VALID, “请远离一点点”);
startActivityForResult(intent, KEY_TO_DETECT_REQUEST_CODE);
在onActivityResult接收数据
在nActivityResult(int requestCode, int resultCode, Intent data)中获取识别到的关键帧,如果当前输出模式是multiimage模式获取图片信息
如果 resultCode == Activity.RESULT_OK, 则活体检测成功, 否则活体检测失败
if (resultCode == RESULT_OK) {
DFProductResult mResult = ((DFTransferResultInterface) getActivity().getApplication()).getResult();
//获取关键帧图像
DFLivenessSDK.DFLivenessImageResult[] imageResultArr = mResult.getLivenessImageResults();
if (imageResultArr != null) {
int size = imageResultArr.length;
if (size > 0) {
DFLivenessSDK.DFLivenessImageResult imageResult = imageResultArr[0];
Bitmap imageBitmap = BitmapFactory.decodeByteArray(imageResult.image, 0, imageResult.image.length);
}
}
//获取活体检测加密数据
byte[] livenessEncryptResult = mResult.getLivenessEncryptResult()
} else {
if (data != null) {
int errorCode = data.getIntExtra(DFActionLivenessActivity.KEY_RESULT_ERROR_CODE, -10000);
Log.e("onActivityResult", "action liveness cancel,error code:" + errorCode);
}
}
当活体检测失败的时候,错误码(errorCode)参考 错误码
开启 anti-hack
如果你想要开启anti-hack, 请设置 KEY_ANTI_HACK(default false)参数.
intent.putExtra(DFSilentLivenessActivity.KEY_ANTI_HACK, true);
如果你想要自己实现anti-hack
发送 加密数据 服务端, 你可以参考下面的代码.
/**
* DFNetworkUtil.java
* package com.liveness.dflivenesslibrary.net
**/
public static DFNetResult doAntiHack(byte[] data) {
HashMap<String, byte[]> hashMap = new HashMap<>(1);
hashMap.put("liveness_data_file", data);
DFNetResult dfNetResult = new DFNetResultLiveness();
return doInternal(SILENT_ANTI_HACK_URL, null, hashMap, dfNetResult, new NetworkResultProcess() {
@Override
public void resultProcess(DFNetResult result, JSONObject netResult) {
double score = netResult.optDouble("score");
result.mNetworkResultStatus = score < ANTI_HACK_THRESHOLD;
}
});
}
2.5 AndroidX迁移
项目目录下build.gradle中gradle插件版本不低于 3.2.0
classpath 'com.android.tools.build:gradle:3.2.0'
compileSdkVersion和targetSdkVersion版本不低于28
compileSdkVersion 28
defaultConfig {
targetSdkVersion 28
}