Android接入

本文从简单接入(使用限制、接入步骤)和SDK进阶使用两个阶段,结合示例代码介绍Android客户端的接入流程。

使用限制

Android SDK使用限制如下:

  • 不支持模拟器模式调试。

  • 仅支持Android 4.4及以上系统版本的移动智能设备(手机或Pad)接入。

接入步骤

一、前期准备

接入前需要进行权限配置和SDK依赖配置,您可以参考下面的步骤操作。

说明

折叠框点击可以收起。

权限说明

Android SDK中使用的权限已经在SDK包中声明,无需开发者显式声明。

SDK中涉及到的权限使用请参见Android应用权限列表

重要

根据相关合规要求,获取用户设备敏感权限需要同步告知权限申请目的。SDK中已经内置了提示,您可以通过合规权限提醒完成相应配置以开启使用。

依赖配置

下载Android SDK,该SDKAndroid标准AAR包。

下载完毕之后解压,将Android SDK文件夹中的所有aar文件拷贝到主工程模块下的libs目录中(具体以工程实际配置为准),并在模块对应的build.gradle文件中添加如下依赖:

// 阿里云实人认证服务SDK AAR,fileTree 方式依赖指定目录
implementation(fileTree(dir: "libs", includes: ["*.aar"]))

// 阿里云实人认证服务三方依赖库,不能省略
implementation 'com.squareup.okhttp3:okhttp:3.11.0'
implementation 'com.squareup.okio:okio:1.14.0'
implementation 'com.alibaba:fastjson:1.2.83_noneautotype'
说明

上述配置中将实人认证Android SDK全部包引入项目中,如不需要全部引入请参考SDK包裁剪

二、调用SDK

前期准备完成后,需要按下面三个动作完成SDK的调用。

  1. 初始化(install)

  2. 获取MetaInfos(getMetaInfos)

  3. 调用认证方法(verify)

初始化(install)

调用该函数完成SDK内部初始化。请务必做延迟初始化配置,确保在用户同意《隐私权政策》后,在人脸识别业务场景中初始化SDK。

  • 初始化:

    ZIMFacade.install(context);
  • 如需使用IPv6网络初始化,参考如下代码:

    ZIMFacade.installIPv6(context);
  • context参数为当前Applicationcontext

获取MetaInfos(getMetaInfos)

移动端环境信息发送至业务服务器端,业务服务器端将这些信息作为参数之一(MetaInfos)调用服务端初始化认证接口(InitFaceVerify),从而获取CertifyId,用于后续认证环节。

重要

MetaInfos数据会影响认证服务器提供的服务类型,不要使用硬编码的模拟数据,否则可能导致无法认证。

  • 调用代码:

    // context参数为当前Applicationcontext。
    ZIMFacade.getMetaInfos(context);
  • 返回值:String类型,以JSON格式返回当前移动设备端的环境信息。(点击查看)

    注意:JSON仅作为结构示范,由于不通设备产生的数据不一样,调试时请使用真实数据,否则可能无法认证。

    {
        "apdidToken": "xxxx",
        "appName": "com.aliyun.facedemo",
        "appVersion": "1.2.8",
        "bioMetaInfo": "6.7.0:21478612992,0",
        "deviceModel": "Mi 10",
        "deviceType": "android",
        "osVersion": "12",
        "sdkVersion": "2.1.0",
        "securityVersion": "2",
        "voiceSdkVersion": "1.0.0",
        "zimVer": "1.0.0"
    }

调用认证方法(verify)

调用示例如下:

ZIMFacade zimFacade = ZIMFacadeBuilder.create(MainActivity.this);
zimFacade.verify(certifyId,useMsgBox,extParams,callback);

verify方法参数详细说明(点击查看)

参数

类型

说明

certifyId

String

从服务端初始化认证接口(InitFaceVerify)获取的CertifyId。

说明

每个CertifyId只能调用一次verify函数,每次调用verify函数之前务必重新获取CertifyId。

useMsgBox

boolean

当刷脸认证过程中出现异常情况,是否使用SDK内部的弹框提示。取值:

  • true:SDK先弹框提示,确定之后,返回错误code。

  • false:不弹提示框,直接返回错误code,客户业务应用App自行决定如何提示。

extParams

HashMap

<String, String>

用户自定义参数,一般直接传NULL即可。目前支持的自定义字段,extParams取值,详情请参见下方extParams取值说明

重要

金融级多因子意愿认证方案暂不支持此参数,传NULL即可。

callback

ZIMCallback

认证结果的回调接口,定义如下:

public interface ZIMCallback {
    boolean response(ZIMResponse response);
}

ZIMResponse类的使用示例,请参见下文结果处理章节所示的代码。

extParams取值说明

取值

说明

示例值

ext_params_key_use_video

是否返回活体认证视频。取值:

  • true:可在response.videoFilePath或在服务端查询接口获取视频本地路径。

  • false:不返回活体认证视频(默认)。

false

ext_params_key_screen_orientation

认证界面UI朝向。取值:

  • ext_params_val_screen_port:竖屏(默认)。

  • ext_params_val_screen_land:横屏。

ext_params_val_screen_land

ext_params_key_face_progress_color

活体检测页面的进度条颜色。

#FF0000

ext_params_key_ocr_bottom_button_color

OCR识别结果确认页底部按钮颜色。

#FF0000

完整代码示例

完整代码示例如下所示。

public class MainActivity extends Activity {

    private String certifyId = "<从服务端InitFaceVerify接口获取>";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 初始化(install)
        ZIMFacade.install(this);

        // 获取MetaInfos
        String metaInfos = ZIMFacade.getMetaInfos(this);

        // 将MetaInfos发送到App服务器端,调用云端InitFaceVerify接口获取CertifyId。
        // certifyId = getCertifyIdFromServer(metaInfo); // 需客户自己实现

        HashMap<String, String> extParams = new HashMap<>();
        // extParams取值示例
        extParams.put("ext_params_key_use_video", "false");

        // 调用认证方法(verify)
        ZIMFacade zimFacade = ZIMFacadeBuilder.create(MainActivity.this);
        zimFacade.verify(certifyId, true, extParams,new ZIMCallback() {
            @Override
            public boolean response(ZIMResponse response) {
                if (null != response && 1000 == response.code) {
                    // 认证成功
                    Toast.makeText(getApplicationContext(),
                            "认证成功\n" +
                                    "code: " + response.code + "\n" +
                                    "reason: " + response.reason,
                            Toast.LENGTH_LONG).show();
                } else {
                    // 认证失败
                    Toast.makeText(getApplicationContext(),
                            "认证失败\n" +
                                    "code: " + response.code + "\n" +
                                    "reason: " + response.reason,
                            Toast.LENGTH_LONG).show();
                }
                return true;
            }
        });
    }
}

三、结果处理:

认证结果通过verify>callback>response方法提供的ZIMResponse对象传入,示例可参见完整代码示例

ZIMResponse对象包含了诸多属性,结果处理主要关注code(结果编码)和reason(结果原因)即可,常见的编码和原因如下表所示。

错误码

是否计费

错误码文案

错误码描述

1000

刷脸成功

用户完成了刷脸过程,认证建议结果为通过。

该结果仅供参考,可通过调用服务端DescribeFaceVerify接口获取最终认证结果。

1001

系统错误

表示系统错误。

1003

验证中断

表示验证中断。

2002

网络错误

表示网络错误。

2003

客户端设备时间错误

表示客户端设备时间错误。

2006

是(失败次数过多场景不计费)

失败次数过多,或刷脸验证失败。

该结果仅供参考,可通过调用服务端 DescribeFaceVerify 接口获取最终认证结果以及未通过的详细原因。

完整结果编码信息(点击查看

为了方便您在离线环境下也可以查询参考,可以缓存下方表格到本地

客户端错误码

Android

1000

Z5120 - 刷脸成功,认证通过。可通过服务端查询接口获取认证详细资料信息

1001

Z1000 - 其他异常

Z1001 - 人脸识别算法初始化失败

Z1002 - 无法启动相机

Z1003 - 不支持的CPU架构

Z1004 - Android系统版本过低

Z1018 - 无前置摄像头

Z1019 - 摄像头权限未赋予

Z1020 - 打开摄像头失败

Z1021 - 摄像头流错误

Z1023 - 认证内部错误

Z1024 - SDK认证流程正在进行中,请等待本地认证流程完成后再发起新调用

Z1029 - 系统版本过低,不支持录屏

Z1030 - 录音权限未赋予

Z1031 - 录屏权限未赋予

Z1032 - 麦克风打开失败

Z1033 - 录屏打开失败

Z1035 - Context为空

Z1036 - 认证之前没有调用 install() 接口完成初始化

Z1037 - CertifyIdnull或长度为0

Z1056 - 混淆配置错误

Z1039 - 多进程使用webview

Z1045 - Context为空

Z1046 - 刷脸过程中断

Z1047 - 模型数据错误

Z1048 - 质量认证异常

Z5112 - 上传炫彩Meta信息失败

Z5113 - 上传炫彩视频失败

Z5114 - 认证视频上传失败

Z6001 - OCR识别次数超限

Z6003 - OSS Token过期

Z6004 - 人脸照片处理失败

Z7001 - SDK初始化或者使用过程中数据异常

Z3002 - 拒绝打开系统NFC功能

Z3003 - 设备不支持NFC

Z3004 - NFC协议相关异常

Z3005 - 透传模式三要素错误

Z5115_4 - so加载异常

A4001 - 刷脸模块接入异常

A4002 - 炫彩模块接入异常

A4003 - OCR模块接入异常

A4004 - NFC模块接入异常

A4005 - 意愿模块接入异常

1003

Z1005 - 刷脸超时(单次)

Z1006 - 多次刷脸超时

Z1008 - 用户在认证过程中点击X退出

Z1009 - 用户在授权页面点击“暂不授权”退出

Z1013 - 活体检测不通过

Z1041 - OCR重试次数过多退出

Z1044 - 认证过程中折叠屏设备折叠/展开状态调整

Z3001 - NFC重试超过限制

2002

Z1011 - 客户端初始化网络错误

Z1012 - 客户端网络访问异常

Z1025 - 客户端初始化接口返回网络错误

Z1026 - 信息上传网络错误

Z1027 - 服务端认证接口网络错误

Z1028 - 服务端接口并发请求超出限制

Z1040 - 刷脸模型下载失败

Z1042 - OCR认证服务报错

Z1043 - 刷脸认证服务报错

Z5116 - 音频文件上传失败

Z6002 - OCR图片上传网络超时

2003

客户端设备时间错误

2006

Z5128 - 刷脸失败,认证未通过。可通过服务端查询接口获取认证未通过具体原因。

SDK的进阶使用

并行开发Demo

前后端并行开发可以下载Demo代码包快速体验功能:

Android Demo代码包

说明

其中的certifyId需要参照二、调用SDK中的步骤获取。

混淆配置(重要)

如果您的工程使用了代码混淆,请务必在App工程的proguard-rules.pro文件中添加如下配置信息,以防止接口被混淆处理后造成功能异常。

说明

您可以根据实际使用的SDK功能,删除多余的混淆配置。

# 必须要依赖到应用混淆中
-keepclassmembers,allowobfuscation class * {
     @com.alibaba.fastjson.annotation.JSONField <fields>;
}
-keep class net.security.device.api.** {*;}
-keep class face.security.device.api.** {*;}
-keep class com.alipay.deviceid.** { *; }
-keep class org.json.** { *;}
-keep class com.alibaba.fastjson.** {*;}

# SDK混淆配置
-keep class com.alipay.face.api.** {*;}
-keep class com.alipay.zoloz.toyger.**{*;}
-keep class com.dtf.face.api.** {*;}
-keep class com.dtf.face.ocr.verify.DTFOcrFacade { *; }
-keep class com.dtf.face.verify.** {*;}
-keep class com.dtf.face.network.model.** {*;}
-keep class com.dtf.face.network.APICallback {*;}
-keep class com.dtf.face.config.**{*;}
-keep class com.dtf.face.log.** {*;}
-keep class com.dtf.face.ui.overlay.** {*;}
-keep class com.dtf.face.ui.widget.ToygerWebView {*;}
-keep class com.dtf.face.utils.ClientConfigUtil{
   boolean needUploadPreviewTrace*();
   boolean needVideoExDegrade*();
   boolean isCfgVideoExDevice*();
}
-keep class com.dtf.toyger.base.** {*;}
-keep class com.dtf.face.network.mpass.biz.model.** { *; }
-keep class com.dtf.face.utils.LogUtils { *; }
-keep class com.dtf.wish.api.** { *; }
-keep class com.dtf.wish.ui.** { *; }
-keep class com.dtf.wish.ui.WishFragment{*;}
-keep class com.dtf.voice.api.** { *; }
-keep class xnn.* { *; }
-keep class facadeverify.** { *; }
-keep class baseverify.** { *; }
-keep class faceverify.** { *; }
-keep class ocrverify.** { *; }
-keep class wishverify.** { *; }

# R8编译混淆配置
-keep class com.dtf.face.ui.toyger.FaceLoadingFragment{ *; }
-keep class com.dtf.face.ui.toyger.FaceShowFragment{*;}
-keep class com.dtf.face.ui.toyger.FaceShowElderlyFragment{*;}
-keepclassmembers class com.dtf.face.camera.ICameraCallback{
   void onPreviewFrame*(*);
}

# NFC编译配置
-keep class com.dtf.face.nfc.verify.DTFNfcFacade { *; }
-keep class com.eidlink.**{*;}
-keep class net.sf.**{*;}
-keep class org.**{*;}
-keep class cn.**{*;}
-keep class com.froad.**{*;}
-keep class com.huawei.**{*;}
-keep class com.eidlink.**{*;}
-keep class org.ejbca.cvc.**{*;}
-keep class org.jmrtd.**{*;}
-keep public class com.netease.nis.sdkwrapper.Utils {public <methods>;}
-keep class net.sf.scuba.**{*;}
-keep class org.eid_bc.bouncycastle.jcajce.provider.symmetric.**{*;}

# 忽略警告
-dontwarn okio.**
-dontwarn org.apache.commons.codec.binary.**

SDK包裁剪

一些特殊的场景和需求会使用到SDK包裁剪功能,例如App打包体积要求或者三方依赖冲突等。

如果需要判断功能是否可裁剪或者需要查找每个包负责的功能描述,请参见SDK包裁剪说明

SDK UI自定义设置

如果对认证页面的UI有自定义的需求,SDK提供了UI自定义配置功能,可以对认证页面的文本、颜色和icon进行配置。

详细操作,请参见Android SDK UI自定义配置说明