本文从简单接入(使用限制、接入步骤)和SDK进阶使用两个阶段,结合示例代码介绍Android客户端的接入流程。
使用限制
Android SDK使用限制如下:
不支持模拟器模式调试。
仅支持Android 4.4及以上系统版本的移动智能设备(手机或Pad)接入。
接入步骤
一、前期准备
接入前需要进行权限配置和SDK依赖配置,您可以参考下面的步骤操作。
折叠框点击可以收起。
二、调用SDK
前期准备完成后,需要按下面三个动作完成SDK的调用。
初始化(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);
调用认证方法(verify)
调用示例如下:
ZIMFacade zimFacade = ZIMFacadeBuilder.create(MainActivity.this);
zimFacade.verify(certifyId,useMsgBox,extParams,callback);完整代码示例
完整代码示例如下所示。
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 接口获取最终认证结果以及未通过的详细原因。  | 
完整结果编码信息(点击查看)
SDK的进阶使用
并行开发Demo
前后端并行开发可以下载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.network.PopNetHelper { *; }
-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自定义配置说明。