活体检测

2024.11.20 10:20:47

    根据提示做出相应动作,SDK 实时采集动态信息,判断用户是否为活体、真人

    ⚠️ 接入活体SDK注意事项:

    1. 如果您的产品服务的用户主要在海外,请联系技术支持提供海外专属技术方案。

    兼容性

    条目 说明
    适配版本 minSdkVersion 16 及以上版本
    cpu 架构 内部提供了 armeabi-v7a 和 arm64-v8a 两种 so ,对于不兼容 arm 的 x86 机型不适配

    资源引入

    远程仓库依赖(推荐)

    从 2.2.2 版本开始,提供远程依赖的方式,本地依赖的方式逐步淘汰。本地依赖集成替换为远程依赖请先去除干净本地包,避免重复依赖冲突

    确认 Project 根目录的 build.gradle 中配置了 mavenCentral 支持

    buildscript {
        repositories {
            mavenCentral()
        }
        ...
    }
    
    allprojects {
        repositories {
            mavenCentral()
        }
    }
    

    在对应 module 的 build.gradle 中添加依赖

    implementation 'io.github.yidun:livedetect:3.2.3'
    implementation 'com.squareup.okhttp3:okhttp:3.12.12'    //若项目中原本存在无需添加 
    

    本地手动依赖

    获取 SDK

    从易盾官网下载活体检测 sdk 的 aar 包 包地址

    添加 aar 包依赖

    将获取到的 aar 文件拷贝到对应 module 的 libs 文件夹下(如没有该目录需新建),然后在 build.gradle 文件中增加如下代码

    android{
        repositories {
            flatDir {
                dirs 'libs'
            }
        } 
    }    
    
    dependencies {
        implementation(name:'alive_detected_libary', ext: 'aar')      
        implementation(name: 'openCVLibrary343-release', ext: 'aar')  
        implementation 'com.squareup.okhttp3:okhttp:3.12.12'    //若项目中原本存在无需添加        
        implementation 'com.google.code.gson:gson:2.8.6'      //若项目中原本存在无需添加          
    }
    

    各种配置

    权限配置

    SDK 依赖如下权限

    <uses-permission android:name="android.permission.CAMERA" />
    

    其中 CAMERA 权限是隐私权限,Android 6.0 及以上需要动态申请。使用前务必先动态申请权限

    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, 0);
    

    混淆配置

    在 proguard-rules.pro 文件中添加如下混淆规则

    -keeppackagenames com.netease.nis.alivedetected
    -keep class com.netease.nis.alivedetected.**{*;}
    -dontwarn com.netease.nis.alivedetected.**
    -keep class com.netease.cloud.nos.yidun.**{*;}
    -dontwarn com.netease.cloud.nos.yidun.**
    

    快速调用示例

    在 layout 布局文件中使用活体检测相机预览 View

    注意点

    • 为了避免在某些中低端机型上检测卡顿,建议预览控件的宽与高不要设置为全屏,过大的预览控件会导致处理的数据过大,降低检测流畅度
    • 预览宽高不要随意设置,请遵守大部分相机支持的预览宽高比,3:4 或 9:16

    示例

     <com.netease.nis.alivedetected.NISCameraPreview
                android:id="@+id/surface_view"
                android:layout_width="360dp"
                android:layout_height="480dp" />
    

    在代码中调用相对应 api 开启活体检测

    public class DemoActivity extends AppCompatActivity {
        private AliveDetector aliveDetector;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_demo);
    
            NISCameraPreview cameraPreview = findViewById(R.id.surface_view);
            cameraPreview.getHolder().setFormat(PixelFormat.TRANSLUCENT);
            aliveDetector = AliveDetector.getInstance();
            aliveDetector.init(this, cameraPreview, "申请的业务id");
            aliveDetector.setDetectedListener(new DetectedListener() {
                @Override
                public void onReady(boolean isInitSuccess) {
    
                }
    
                @Override
                public void onActionCommands(ActionType[] actionTypes) {
    
                }
    
                @Override
                public void onStateTipChanged(ActionType actionType, String stateTip) {
                    ///单步动作 actionType.getActionID()为 0:正视前方 1:向右转头 2:向左转头 3:张嘴动作 4:眨眼动作 5:动作错误 6:动作通过
                }
    
                @Override
                public void onPassed(boolean isPassed, String token) {
    
                }
                
                @Override
                public void onCheck() {
    
                }
    
                @Override
                public void onError(int code, String msg, String token) {
    
                }
    
                @Override
                public void onOverTime() {
    
                }
       
            });
            aliveDetector.startDetect();
        }
    	 
        
        @Override
        protected void onDestroy() {
            super.onDestroy();
    
            if (isFinishing()) {
                if (aliveDetector != null) {
                    aliveDetector.stopDetect();
                    aliveDetector.destroy();
                }
            }
        }
    }
    

    更多使用场景请参考 demo

    SDK 方法说明

    1. 获取 AliveDetector 单例对象

    代码说明

    AliveDetector aliveDetector = AliveDetector.getInstance();
    

    2. 初始化

    代码说明

    aliveDetector.init(Context context, NISCameraPreview cameraPreview, String businessId)
    

    参数说明

    参数 类型 是否必填 默认值 描述
    context Context 上下文
    cameraPreview NISCameraPreview 相机预览 View
    businessId String 活体检测业务 id

    3. 设置回调监听

    代码说明

    aliveDetector.setDetectedListener(DetectedListener detectedListener)
    

    参数说明

    参数 类型 是否必填 默认值 描述
    detectedListener DetectedListener 监听接口

    DetectedListener 接口说明

    public interface DetectedListener {
        /**
         * 活体检测引擎初始化时回调
         *
         * @param isInitSuccess 活体检测引擎是否初始化成功:
         *                      1)true,初始化完成可以开始检测
         *                      2)false,初始化失败,可尝试重新启动活体检测流程 {@link AliveDetector#startDetect()}
         */
        void onReady(boolean isInitSuccess);
    
        /**
         * 此次活体检测下发的待检测动作指令序列,{@link ActionType}
         *
         * @param actionTypes
         */
        void onActionCommands(ActionType[] actionTypes);
    
        /**
         * 活体检测状态是否改变,当引擎检测到状态改变时会回调该接口
         *
         * @param actionType 当前动作类型,枚举值,总共6种类型:
         *     ACTION_STRAIGHT_AHEAD("0", "正视前方"),
         *     ACTION_TURN_HEAD_TO_RIGHT("1", "向右转头"),
         *     ACTION_TURN_HEAD_TO_LEFT("2", "向左转头"),
         *     ACTION_OPEN_MOUTH("3", "张嘴动作"),
         *     ACTION_BLINK_EYES("4", "眨眼动作"),
         *     ACTION_ERROR("5", "动作错误"),
         *     ACTION_PASSED("6", "动作通过")
         *                   
         * @param stateTip   引擎检测到的实时状态
         */
        void onStateTipChanged(ActionType actionType, String stateTip);
    
        /**
         * 活体检测是否通过回调
         *
         * @param isPassed 活体检测是否通过,true:通过,false:不通过
         * @param token    此次活体检测返回的易盾token
         */
        void onPassed(boolean isPassed, String token);
        /**
         * 活体检测本地检测通过
         * 启动远程检测
         */    
        void onCheck();
        /**
         * 活体检测过程中出现错误时回调
         *
         * @param code 错误码
         * @param msg  出错原因
         */
        void onError(int code, String msg, String token);
    
        /**
         * 活体检测过程超时回调
         */
        void onOverTime();
    }
    

    4. 开始活体检测

    代码说明

    aliveDetector.startDetect()
    

    5. 停止活体检测

    代码说明

    aliveDetector.stopDetect()
    

    6. 释放资源(建议放在 onDestroy)

    代码说明

    aliveDetector.destroy()
    

    7. 是否开启调试模式(非必须)

    代码添加在 init 之后 startDetect 之前

    代码说明

    aliveDetector.setDebugMode(boolean isDebug)
    

    参数说明

    参数 类型 是否必填 默认值 描述
    isDebug boolean false 是否打印日志

    8. 设置检测动作灵敏度(非必须)

    代码添加在 init 之后 startDetect 之前

    代码说明

    aliveDetector.setSensitivity(int sensitivity)
    

    参数说明

    参数 类型 是否必填 默认值 描述
    sensitivity int AliveDetector.SENSITIVITY_NORMAL 可取值 AliveDetector.SENSITIVITY_EASY = 0、AliveDetector.SENSITIVITY_NORMAL = 1、AliveDetector.SENSITIVITY_HARD = 2 分别对应容易、普通、难

    9. 设置超时时间(非必须)

    代码添加在 init 之后 startDetect 之前

    代码说明

    aliveDetector.setTimeOut(long timeout)
    

    参数说明

    参数 类型 是否必填 默认值 描述
    timeout long 120000 单位毫秒

    10. 设置域名(非必须)

    用于海外域名失效的场景,可以设置私有化的域名列表,内部会自动切换

    代码说明

    aliveDetector.setHosts(String[] hosts)
    

    参数说明

    参数 类型 是否必填 默认值 描述
    host String[] 多域名

    11. 是否允许多人脸(非必须)

    用于海外域名失效的场景,可以设置私有化的域名列表,内部会自动切换

    代码说明

    aliveDetector.setAllowMultipleFace(boolean allowMultipleFace)
    

    参数说明

    参数 类型 是否必填 默认值 描述
    allowMultipleFace boolean false 是否允许多人脸

    12. 设置设备抖动检测阈值(非必须)

    用于海外域名失效的场景,可以设置私有化的域名列表,内部会自动切换

    代码说明

    aliveDetector.setShakeThreshold(int shakeThreshold)
    
    

    参数说明

    参数 类型 是否必填 默认值 描述
    shakeThreshold int 35 抖动检测阈值
    在线咨询 电话咨询:95163223 免费试用