# 配置流程

## 接入配置

### 注意事项

- 人脸核身 SDK 最低支持 Android 4.0 以上版本 API LEVEL 16。
- 人脸核身 SDK 仅支持 armeabi-v7a
- 人脸核身 SDK 将以 AAR 文件的形式提供，faceid-release.aar 和 faceplatform-release.aar。
- 人脸核身 SDK 同时需要依赖**公共组件（common-release.aar）**，同样也是以 AAR 文件的形式提供，详情请参见 [添加依赖](#yilai)。


### 配置证书和签名

1. 提供应用ID和签名文件md5码获取以下2个证书文件（[如何获取应用ID和签名文件md5码](https://cugeducn-my.sharepoint.com/:b:/g/personal/zhouxc_cug_edu_cn/EQA0mcJoDFhPvJmuKXIuumEBuDf-Bo9seappz2OqhW06fQ?e=ZzQoUC)），放入您的项目目录 `app\src\main\assets`。
    * idl-key.face-android
    * idl-license.face-android
2. app\build.gradle 内配置：

    ```
    android {
        ...
        signingConfigs {
            debug {
                storeFile file('xxxx.jks')//申请证书时的签名文件
                storePassword 'xxxx'
                keyAlias = 'xxxx'
                keyPassword 'xxxx'
            }
        }
        ...
        defaultConfig {
        ...
        ndk {
                abiFilters  "armeabi-v7a"//sdk仅支持，大于这个范围运行，会报找不到xxx.so文件
            }
        ...
        }
    }

    ```

<span id='yilai'></span>

### 添加依赖

将提供的 AAR 文件加入到 App 工程的 libs 文件夹内，并且在 build.gradle 中添加下面的配置。

```
android{
     //...
     repositories {
        flatDir {
            dirs 'libs' //this way we can find the .aar file in libs folder
        }
    }
}

//添加依赖
dependencies {
    // json依赖
    implementation 'com.alibaba:fastjson:1.2.73'
    // okHttp依赖
    implementation 'com.squareup.okhttp3:okhttp:4.0.0'
    // 公共组件
    implementation(name: 'common-release', ext: 'aar')
    // 人脸核身
    implementation(name: 'faceid-release', ext: 'aar')
    implementation(name: 'faceplatform-release', ext: 'aar')
}

```
### 权限检测

在AndroidManifest.xml中添加
```
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
    <uses-permission android:name="android.hardware.camera.autofocus"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_SETTINGS" tools:ignore="ProtectedPermissions" />
        
```
 - **Android 6.0 以上系统**
SDK 需要用到以上权限，对 Android 6.0 以上的系统 SDK 会做权限的运行时检测。
 - **Android 6.0 以下系统**
 -由于 Android 6.0 以下系统 Android 并没有运行时权限检测，建议调用方在拉起 SDK 前，对权限进行检测。-



<span id='shili'></span>

# 接入示例

快速调用：
```
# 在MainActivity中单击某个按钮的代码逻辑

Credential cert=new Credential();
final FaceidSDK.IDCardInputData inputdata=FaceidSDK.getInstance().new IDCardInputData("xxx","xxx");
cert.setPassword("xxxx");
cert.setUserCode("xxxx");
cert.setUrl("xxxx");
cert.setSysName("xxxx");

FaceidSDK.getInstance().init(MainActivity.this, cert,new FaceidSDK.FaceidLoginListener() {
    @Override
    public void onLoginSuccess() { //登录成功,拉起 SDK 页面
        FaceidSDK.getInstance().startActivity(inputdata, new FaceidSDK.FaceidResultListener() {
            @Override
            public void onFailed(String errorCode, String errorMsg) {
                //txtresult.setText("失败：错误码"+errorCode+";错误信息"+errorMsg);
            }

            @Override
            public void onFinish(FaceidSDK.OutputData result) {
                //txtresult.setText("操作完成：识别结果"+result.isSuccess()+";相似分数"+result.getScore());

            }
        });
    }

    @Override
    public void onLoginFailed(String errorCode, String errorMsg) {

    }
});
```

[完整demo下载](./demo/faceidsdkdemo.rar) (跳转后点击查看**原始文件**)

# 接口详细说明

## SDK 接口调用方法

SDK 代码调用的入口为 `FaceidSDK` 这个类。

```
public class FaceidSDK {
    /**
    * 该类为一个单例，需要先获得单例对象再进行后续操作
    */
    public static FaceidSDK getInstance(){
    //    ...
    }
    
    
    /**
    * 自定义动作参数，在init执行之前设置才有效
    * 设置“人脸动作范围”，“从范围中随机选取几个动作”等参数
    */
    public void setFaceSDKConfig(FaceSDKConfig faceSDKConfig) {
    //    ...
    }

    /**
    * 在使用SDK前先初始化，
    * 传入证书key `credential`，
    * 由 FaceidLoginListener返回是否初始化SDK成功
    */
    public void init(Context context,Credential credential, FaceidLoginListener loginListerner){
    //    ...
    }

    /**
    * 入口方法一
    * 初始化成功后，调用此函数拉起sdk页面。
    * 传入IDCardInputData（身份证，姓名）
    * 由FaceidResultListener返回人脸核身结果。
    */
    public void startActivity(IDCardInputData data,FaceidResultListener resultListener) {    
        // ...
    }
    
    /**
    * 入口方法二
    * 初始化成功后，调用此函数拉起sdk页面。
    * 传入PhotoInputData（照片）
    * 由FaceidResultListener返回人脸核身结果。
    */
    public void startActivity(PhotoInputData data,FaceidResultListener resultListener) {    
        // ...
    }

    /**
     * 初始化回调接口
     */
    public interface FaceidLoginListener {
        void onLoginSuccess();
        void onLoginFailed(String errorCode, String errorMsg);
    }

    /**
    * 人脸核身结果回调接口
    */
    public interface FaceidResultListener{
        void onFailed(String errorCode, String errorMsg);
        void onFinish(OutputData result);
    }
```

`startActivity()` 的参数PhotoInputData和IDCardInputData用来传递数据：

 ```
    String name; //姓名
    String idNum; //身份证
    ----
    DataItem photo;//照片信息
 ```

> 以上参数被分别封装在 `FaceidSDK.PhotoInputData`，`FaceidSDK.IDCardInputData` 对象中。

## 接入示例
关于接口调用的示例可参考 [接入示例](#shili)

<span id='canshu'></span>

## 接口参数说明

| IDCardInputData参数 | 说明 | 类型 | 长度（字节） | 是否必填 |
| --- | --- | --- | --- | --- |
| name | 核验人的姓名| String | - | 是 | 
| idNum | 核验人的身份证号 | String | 32 | 是 |


| PhotoInputData参数 | 说明 | 类型 | 长度（字节） | 是否必填 |
| --- | --- | --- | --- | --- |
| photo | 核验人的照片，DataItem属性见下表| DataItem | - | 是 | 


| DataItem属性 | 说明 | 类型  | 是否必填 |
| --- | --- | --- | --- |
| origin        | 文件类型<br/> base64形式：self<br/> 链接形式：uri  <br/> | DataItem.DataOrigin |  是       |
| data | 照片内容（base64或uri链接）| String | 是 | 


<span id='zidingyi'></span>
## 动作参数说明

| FaceSDKConfig参数 | 说明 | 类型 |
| --- | --- | --- |
| actions | 动作范围<br/> 可选"eye","mouth","headRight","headLeft","headUp","headDown","yaw"<br/>默认包含所有| List\<String\> | 
| actionOrderRandom | 动作顺序是否随机，默认true | boolean | 
| actionNum | 随机从actions中选取几个动作，默认3 | int | 


## 动作

| 参数名 | 说明 |
| --- | --- |
| eye | 眨眼 |
| mouth | 张嘴 |
| headRight | 头右转 |
| headLeft | 头左转 |
| headUp | 抬头 |
| headDown | 点头 |
| yaw | 摇头 |
