Android-SDK-活体检测

开发准备

前往注册: 账号由 ADVANCE AI 发放, 请联系 ADVANCE AI。

快速体验 Demo

方式一:

安装 CV-Demo.apk 到您的手机,使用测试账号进行登录。

方式二:
  1. 打开任意安卓工程,在项目的 build.gradle 中增加 maven 仓库配置:

    maven {
        url 'http://public-n3.advai.net/repository/maven-releases/'
        // 若您的 gradle 版本大于 7.0,需要增加如下配置允许通过 http 拉取 aar
        allowInsecureProtocol = true
    }
  2. 在项目的 app 模块build.gradle增加库依赖:

    dependencies {
        ...
        implementation 'ai.advance.mobile-sdk.android:liveness-detection:1.3.9.1'
        // 默认 UI 模块,实际集成时,如果您有自定义页面的需求,请通过下方链接下载源码
        // https://prod-guardian-cv.oss-ap-southeast-5.aliyuncs.com/sdk/android/liveness/support/liveness-support.zip
        implementation 'ai.advance.mobile-sdk.android:liveness-detection-ui:1.0.0@aar'
    }
  3. 如果您的项目依赖 androidx 库,请在项目根目录下 gradle.properties 增加如下配置:

    android.enableJetifier=true
  4. 在您的 Activity 中参照如下代码启动活体检测:

    public class MainActivity extends AppCompatActivity {
        public static final int REQUEST_CODE_LIVENESS = 1001;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            findViewById(R.id.startBtn).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    startLivenessDetection();
                }
            });
        }
    
        public void startLivenessDetection() {
            Market yourMarket = Market.xxx;
            GuardianLivenessDetectionSDK.init(getApplication(), yourMarket);
            GuardianLivenessDetectionSDK.letSDKHandleCameraPermission();
            String yourLicense = "xxxxx";
            String checkResult = GuardianLivenessDetectionSDK.setLicenseAndCheck(yourLicense);
            if ("SUCCESS".equals(checkResult)) {
                startActivityForResult(new Intent(this, LivenessActivity.class), REQUEST_CODE_LIVENESS);
            } else {
                Log.e("LivenessSDK", "License check failed:" + checkResult);
            }
        }
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if (requestCode == REQUEST_CODE_LIVENESS) {
                if (LivenessResult.isSuccess()) {
                    Bitmap livenessBitmap = LivenessResult.getLivenessBitmap();
                    String livenessId = LivenessResult.getLivenessId();
                    //...
                } else {
                    Log.e("LivenessSDK", "Detection failed,errorCode:" + LivenessResult.getErrorCode());
                }
            }
        }
    }

集成 SDK 到您的工程中

根据您项目依赖的 Google 库的类型选择下载 UI 模块源码,下载完成解压后将liveness文件夹拷贝至您的项目中作为一个普通的module进行依赖。

SDK 版本更新

快速入门

  1. 初始化与鉴权。

    SDK 提供两种授权方式,您可以根据业务需求选择适合的方式。

  2. 启动活体检测与获取检测结果。

    SDK 默认不检查相机权限,如果您希望权限的申请交由 SDK 处理,可在 SDK 初始化方法调用后,调用如下方法,则 LivenessActivity 中会执行权限申请的操作:

    GuardianLivenessDetectionSDK.letSDKHandleCameraPermission();

    每次进行活体检测成功后,会返回唯一的 livenessId 和本次检测的 600*600 像素的清晰正面照片。

  3. 动作顺序说明

    默认的动作顺序是 [眨眼]->[摇头],如需自定义动作顺序请参考如下代码:

    在启动LivenessActivity页面前调用如下方法:

    // 第一个布尔值代表是否打乱传入的动作顺序,true 代表打乱顺序。
    GuardianLivenessDetectionSDK.setActionSequence(true,Detector.DetectionType.POS_YAW, Detector.DetectionType.MOUTH, Detector.DetectionType.BLINK);
  4. 自定义返回的图像尺寸

    // 支持设置的入参范围:[300,1000],单位:像素
    GuardianLivenessDetectionSDK.setResultPictureSize(600); 
  5. 返回多张图片(默认关闭)

    支持在每个动作分别采集一张图像,如果打开此开关,由于额外采集了多张图片,会导致 SDK 运行时内存占用提升,如果您的 App 本身已经占用较多内存,则打开此项配置可能会引发内存溢出,请谨慎选择。

    GuardianLivenessDetectionSDK.capturePictureQueue(true);

    获取图片序列(活体检测成功后获取):

    List<String> imageSequenceList = LivenessResult.getImageSequenceList();
  6. 自定义动作时间

    支持自定义动作的检测时间,设置后所有动作都生效,单位:毫秒

    GuardianLivenessDetectionSDK.setActionTimeoutMills(10000);
  7. 用户绑定(强烈建议)。

    您可以通过该方法将自己的用户唯一标识传给我们,我们会根据该标识建立映射关系。当遇到问题时,方便同我们进行日志追踪。

    GuardianLivenessDetectionSDK.bindUser(String userId)
  8. 开启遮挡检测

    遮挡检测默认是关闭状态,如需开启遮挡检测,请在初始化SDK之后调用如下方法设置

    GuardianLivenessDetectionSDK.isDetectOcclusion(true)
  9. 国际化

    SDK 支持中文,英文,印尼文,越南语,泰国语,印地语,西班牙语 七种语言/语音,跟随手机系统语言自动切换,无需代码设置。

    若没有跟随系统语言自动切换 ,请检查手机语言设置,确保【地区】和【语言】均已切换至对应的语言。
    若仍然出现语言国际化问题,同时 app 仅支持某种语言,可以通过在build.gradle中增加如下配置,过滤掉不需要的语言

    android {
        defaultConfig {
            ...
            resConfigs("in-rID") // 以仅支持印尼语为例
        }
    
    }
  10. 运行时权限

    本 SDK 需要如下权限,并且已经在 aar 的清单文件中做了配置。

    <uses-feature android:name="android.hardware.camera" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.CAMERA" />
  11. 关于 App Bundle 打包

    SDK 中包含 .so 文件,为了减少包大小,在上架 Google Play 时可以选择使用 Bundle 打包,请验证打包后的 APK 在各个架构的手机上都可以运行,如果出现提示【该设备不支持】,则表示组装 APK 时缺失了 .aar 中的 .so 文件。

  12. 代码混淆

    SDK 已经做好了代码混淆,无需额外增加配置。

  13. 关于Androidx

    考虑到 Androidx 与 support 包的互斥,本 SDK 的 .aar 全部是 support 包,如果您的项目是 androidX 类包,编译时遇到提示 support 包冲突错误,请在您项目的根目录下的gradle.properties文件中增加下述配置,重新编译项目即可:

    android.enableJetifier=true 
  14. SDK 兼容性


Error Code:

错误码 解释 解决办法
FACE_MISSING 检测过程中人脸丢失 /
ACTION_TIMEOUT 动作超时 /
MULTIPLE_FACE 检测过程中出现多张人脸 /
MUCH_MOTION 检测过程中动作幅度过大 /
AUTH_BAD_NETWORK 授权请求网络失败 连接 VPN 后重试
CHECKING_BAD_NETWORK 动作结束后图像上传网络请求失败 连接 VPN 后重试
DEVICE_NOT_SUPPORT 该设备不支持活体检测 设备无前置摄像头或不可用
USER_GIVE_UP 用户中途放弃检测 /
UNDEFINED 未定义的其他错误类型 /
AUTH_PARAMETER_ERROR 授权请求参数错误 请检查初始化方法传入的 key 是否为 SDK 的,并且确保 Market 匹配
AUTH_IAM_FAILED 包名未备案 在 SaaS 上自主配置(Personal Management -> ApplicationId Management)或联系我们添加