# 配置流程

## 接入配置

### 注意事项

- SDK 最低支持 Android 4.0 以上版本 API LEVEL 16。
- SDK 将以 AAR 文件的形式提供,[cepm-sdk-release.aar](#demo) 和 [sdkproject-release_enc.aar](#demo),详情请参见 [添加依赖](#yilai)。
- 提供多个入口方法,请根据业务选择

### 准备工作

1. 向AI平台申请使用凭证
2. 需要提供使用环境的Appid、目标客户
3. LicenseID标签已废弃,无需关注
4. 使用凭证包含如下部分:
    - SysName:系统名称
    - UserCode:用户名
    - Password:密钥
    - Url:AI平台服务链接

<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 {
    //...other...
    //集成sdk依赖
    implementation 'com.alibaba:fastjson:1.2.73'
    implementation 'com.squareup.okhttp3:okhttp:4.0.0'
    implementation files('libs/cepm-sdk-release.aar')
    implementation files('libs/sdkproject-release_enc.aar')
}

```

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

# 接入示例
初始化:该步骤必须进行,否则无法调用
```
# 项目需要增加Application类
public class MyApp extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        //必须执行初始化
        CepmApp.init(this);
    }
}

```

快速调用:
```
# 在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,"你的LicenseID", 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) {

    }
});
```
<span id='demo'></span>

[完整demo和sdk下载](./demo/demo-sdk.zip) (跳转后点击查看**原始文件**)

# 接口详细说明

1. [Faceid接口](#faceid)
2. [Ocr接口](#ocr)

<span id='faceid'></span>

## SDK Faceid 接口

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

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

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

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

    /**
    * 入口方法三 照片采集
    * 初始化成功后,调用此函数拉起sdk照片采集页面。
    * 由faceDataResultListener返回照片。
    */
    public void startActivity(faceDataResultListener 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);
    }
    /**
    * 照片采集结果回调接口
    */
    public interface FaceDataResultListener {
    void onFailed(String errorCode, String errorMsg);
    void onFinish(OutputFaceData 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 | 是 | 


### 动作参数说明

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

<span id='dongzuo'></span>

### 动作

| 参数名 | 说明 |
| --- | --- |
| eye | 眨眼 |
| mouth | 张嘴 |
| headRight | 头右转 |
| headLeft | 头左转 |

<span id='ocr'></span>

## SDK Ocr 接口

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

```
public class OcrSDK {
    /**
    * 该类为一个单例,需要先获得单例对象再进行后续操作
    */
    public static OcrSDK getInstance(){
    //    ...
    }
    
    /**
    * 在使用SDK前先初始化,
    * 传入证书key `credential`,
    * 由 OcrLoginListener返回是否初始化SDK成功
    */
    public void init(Context context,Credential credential, final OcrLoginListener loginListerner){
    //    ...
    }


    /**
     * 登录成功后,调用此函数拉起sdk页面
     * 打开拍摄页面,传入证件类型ocrType
     *
     * @param resultListener 返回拍摄图片的路径
     */
    public void startTakePhotoActivity(TakePhotoResultListener resultListener,OcrType ocrType) {
        //    ...
    }

    /**
     * 登录成功后,调用此函数拉起sdk页面
     * 打开身份证正面识别
     * @param resultListener 用于返回识别结果
     */
    public void startIdCardFrontActivity(IdCardFrontResultListener resultListener) {
        //    ...

    }

    /**
     * 登录成功后,调用此函数拉起sdk页面
     * 打开身份证背面识别
     * @param resultListener 用于返回识别结果
     */
    public void startIdCardBackActivity(IdCardBackResultListener resultListener) {
        //    ...

    }
    /**
     * 登录成功后,调用此函数拉起sdk页面
     * 打开银行卡识别
     * @param resultListener 用于返回识别结果
     */
    public void startBankCardActivity(BankCardResultListener resultListener) {
        //    ...

    }

    /**
     * 登录回调接口
     */
    public interface OcrLoginListener {
        void onLoginSuccess();

        void onLoginFailed(String errorCode, String errorMsg);
    }
    
    /**
    * Ocr结果回调接口
    */
    public interface TakePhotoResultListener {
        /**
         * @RARAM exidCardResult SDK返回的识别结果的错误码
         * @RARAM exidCardResult SDK返回的识别结果的错误信息
         */
        void onFailed(String errorCode, String errorMsg);

        void onFinish(String result);
    }
    /**
    * Ocr结果回调接口
    */
    public interface IdCardFrontResultListener {
        /**
         * @RARAM exidCardResult SDK返回的识别结果的错误码
         * @RARAM exidCardResult SDK返回的识别结果的错误信息
         */
        void onFailed(String errorCode, String errorMsg);

        void onFinish(IdCardFrontData result);
    }
    /**
    * Ocr结果回调接口
    */
    public interface IdCardBackResultListener {
        /**
         * @RARAM exidCardResult SDK返回的识别结果的错误码
         * @RARAM exidCardResult SDK返回的识别结果的错误信息
         */
        void onFailed(String errorCode, String errorMsg);

        void onFinish(IdCardBackData result);
    }
    /**
    * Ocr结果回调接口
    */
    public interface BankCardResultListener {
        /**
         * @RARAM exidCardResult SDK返回的识别结果的错误码
         * @RARAM exidCardResult SDK返回的识别结果的错误信息
         */
        void onFailed(String errorCode, String errorMsg);

        void onFinish(BankCardData result);
    }
```