Android接入

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

使用限制

Android SDK使用限制如下:

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

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

接入步骤

一、前期准备

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

说明

折叠框点击可以收起。

权限说明

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

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

重要

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

依赖配置

下载Android SDK,该SDK为Android标准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参数为当前Application的context

获取MetaInfos(getMetaInfos)

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

重要

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

  • 调用代码:

    // context参数为当前Application的context。
    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

完整代码示例

完整代码示例如下所示。您也可以下载Android Demo代码包在本地搭建工程体验。

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(结果原因)即可,常见的编码和原因如下表所示。

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 - CertifyId为null或长度为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加载异常

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的进阶使用

混淆配置(重要)

如果您的工程使用了代码混淆,请务必在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自定义配置说明