1 Android SDK Pro使用说明

1.1 导入开发包

  解压 PayEgisAuthenticationSDK.zip,解压后得到三个文件。如下图所示:

名称 具体内容 说明 备注
*.aar payegisauthenticationsdk-release.aar、payegissdk-deviceid-release.aar、payegissdk-face-release.aar SDK主体
jniLibs armeabi-v7a 等so包 So库 建议使用v7a架构的so库,若需其它架构的so,将v7下的库拷贝至其它arm架构下即可(注:arm64-v8a除外,我们的so库仅支持32位环境运行,如果您的项目下包含arm64-v8a文件夹将导致搭载64位处理器的设备强制加载64位库文件报错)
license aip.license、idl-license.face-android 授权文件 授权文件和应用包名一一绑定,不可在多个应用下使用

  将解压出的payegisauthenticationsdk-release.aar、payegissdk-deviceid-release.aar、payegissdk-face-release.aar拷贝到项目的libs中,

  在工程的gradle文件中添加对payegisauthenticationsdk-release.aar、payegissdk-deviceid-release.aar、payegissdk-face-release.aar的依赖,参见下图:

  在项目工程中添加license授权文件,license文件需要拷贝至项目assets文件夹中。

[danger] 注意

license文件是和应用包名绑定的,因此不同应用使用远程实名认证SDK,需要申请相应的license。

  在项目工程中添加对应的so库文件,我们建议使用v7a架构的so库,如果需要其它架构的so,将v7下的库拷贝至其它arm架构下即可(注:arm64-v8a除外,我们的so库仅支持32位环境运行,如果您的项目下包含arm64-v8a文件夹将导致搭载64位处理器的设备强制加载64位库文件报错)。

1.2 标准产品化流程

  此部分为标准产品化流程。

  所有前期SDK配置完成后,在需要使用远程认证的Activity的onCreate()方法中初始化PayegisAuthSDK类,初始化整个应用内只需进行一次,参考代码如下:

/** * 初始化认证SDK */ public void initSDK() { PayegisAuthSDK sdk = PayegisAuthSDK.getInstance(); sdk.setAppId(Const.AppId);//设置APPID,必须 sdk.setAppKey(Const.AppKey);//设置APPKEY,必须 sdk.setContext(this); //设置上下文,必须 // 是否开启攻击监测,可选 // sdk.setIsMonitorActivityOpen(false); // 是否开启设备风险评估,可选 // sdk.setIsDeviceRiskOpen(true); // 是否允许ocr页面选择相册图片,可选 // sdk.setShowAlbum(true); // 是否显示法律声明,可选 // sdk.setShowLegalNotice(false); sdk.init(); }

[danger] 注意

攻击监测默认关闭,通过sdk.setIsMonitorActivityOpen()方法控制;

设备风险评估默认打开,通过sdk.setIsDeviceRiskOpen()控制。

允许ocr页面选择相册图片默认打开,通过sdk.setShowAlbum()控制。

法律声明默认打开,通过sdk.setShowLegalNotice()控制。

  标准产品化流程需要申请事务号后才能使用,事务号建议由后台获取,具体如何获取token请参见后台服务接口部分,demo中通过startAuth(String txntype)方法获取事务号并开始流程,目前提供三种服务,参数txntype与服务类型的对应 关系如下:

txntype 服务类型
NAME_ID 身份证,活体认证
NAME_ID_BANKCARD 身份证,活体,银行卡三要素认证
NAME_ID_BANKCARD_PHONE 身份证,活体,银行卡,手机号四要素认证

  调用setToken(String token)方法设置已申请到的事务号,远程实名认证系统由参数token来区分不同服务的调用,调用setAuthenticationCallBack(AuthenticationCallBack authenticationCallBack)方法设置回调监听,向其中传入AuthenticationCallBack对象,此接口有两个回调方法onAuthenticationSuccessful()和onAuthenticationFailed(int errCode, String errMsg),分别是认证流程完成和认证流程异常的回调,调用start()方法启动认证流程。

  特别注意的是:Config.appName = "payegispro-face-android";

  调用活体检查需要给APP授权,因此需要配置SDK的Config.appName参数,具体命名规则:

  yourAPPName +“-face-android”

  appName为申请账户时,提交给远程实名管理平台的应用名称。

参考代码如下:

PayegisAuthSDK payegisAuthSDK = PayegisAuthSDK.getInstance(); Config.appName = "payegispro-face-android"; payegisAuthSDK.setToken(token).setAuthenticationCallBack(new AuthenticationCallBack() { @Override public void onAuthenticationSuccessful() { //实名认证成功 } @Override public void onAuthenticationFailed(int errCode, String errMsg) { //实名认证失败 } }).start(); }

1.3 定制SDK中界面样式

1.3.1远程实名认证UI定制

  远程实名认证SDK Pro版本中“远程身份认证”和“远程身份银行卡认证”两种服务UI、UE是封装在SDK中的,因此我们提供了部分定制UI功能,提供如下界面样式设定:

  a) 导航栏背景色设置

  b) 导航栏字体颜色设置

  c) 按钮背景色设置(银行卡卡号确认按钮,在不可点击状态下,颜色不可更改)

  d) 按钮字体颜色设置

  调用PayegisAuthSDK类的setActionBarBackgroundColor(0xff63b962) 、setActionTextColor(0xffe6bd3d)、setButtonBackgroundColor(0xff3F51B5)、 setButtonTextColor(0xffFF4081)方法设置样式,参数为16进制带alpha通道的色值。

[danger] 注意

以上样式定义仅能在“远程身份认证”和“远程身份银行卡认证”两种服务中生效。SDK Pro中其它接口不含UI。

参考代码如下:

PayegisAuthSDK payegisAuthSDK = PayegisAuthSDK.getInstance(); payegisAuthSDK.setToken(token). setActionBarBackgroundColor(0xff217be3). setActionTextColor(0xffffffff). setButtonBackgroundColor(0xff217be3). setButtonTextColor(0xffffffff).start();

1.3.2活体检测UI定制

  活体检测界面提供如下界面样式设定:

  颜色的设置方法参数为16进制带alpha通道的色值,图片的设置方法参数为图片的资源id。

参考代码如下:

Config.setBackgroundColor(0xffffffff);//背景色 Config.setTipTextColor(0xff217be3);//提示语颜色 Config.setProgressColor(0xff217be3);//倒计时进度条颜色 Config.setFaceCircleColor(0xff217be3);//人脸采集框颜色 Config.setCountNumColor(0xff000000);//倒计时数字颜色 Config.setClosePicId(R.drawable.ic_close_ext);//返回按钮 Config.setSuccessPicId(R.drawable.ic_success);//成功按钮 Config.setWarningPicId(R.drawable.ic_warning);//警告按钮 Config.setSoundOffPicId(R.drawable.ic_disable_sound_ext);//关闭提示音按钮 Config.setSoundOnPicId(R.drawable.ic_enable_sound_ext);//打开提示音按钮

[danger] 注意

请在调用活体服务之前进行活体的UI配置(建议在初始化SDK后立即配置),否则将不会生效。

1.4 身份证识别

  SDK Pro中细化封装了身份证识别接口,用以获取身份证正反面图像,并调用相关接口识别身份证正反面文字信息。

1.4.1 身份证正反面图像获取

1.实例化PayegisAuthSDK类。

sdk = PayegisAuthSDK.getInstance();

2.调用身份证OCR扫描页,获取身份证正反面图像,获取图像都以startActivityForResult()方式获取,具体分为三步:

step1 获取相应Intent。具体方法名:

public Intent createIDCardOCRIntent(Context context, int requestCode)

  调用方法createIDCardOCRIntent(),获取相应Intent。以获取身份证正面为例:

//获取身份证OCR Intent Intent it = sdk.createIDCardOCRIntent(this, PayegisAuthSDK.LF_SCAN_ID_CARD_FRONT_REQUEST);

  createIDCardOCRIntent()方法第二个参数指定了获取身份证正面或者反面,其具体定义在PayegisAuthSDK常量中,对于身份证OCR主要有两个常量定义:

常量名称 定义
PayegisAuthSDK.LF_SCAN_ID_CARD_FRONT_REQUEST 获取身份证正面
PayegisAuthSDK.LF_SCAN_ID_CARD_BACK_REQUEST 获取身份证反面

  如果您希望同时获取身份证正反面,则获取拍摄正反两面的Intent。具体方法名:

public Intent createIDCardOCRIntent(Context context, int requestCode, boolean hasFrontImg, boolean hasBackImg)

  第三个参数hasFrontImg代表是否已有正面照片,第四个参数hasBackImg代表是否已有反面照片,调用方法createIDCardOCRIntent(),获取相应Intent。以优先获取身份证正面为例:

boolean hasFrontImg = idCardFrontData == null ? false : true; boolean hasBackImg = idCardBackData == null ? false : true; //获取身份证OCR Intent Intent it = sdk.createIDCardOCRIntent(this, PayegisAuthSDK.LF_SCAN_ID_CARD_FRONT_REQUEST, hasFrontImg, hasBackImg);

step2 调用扫描页,并处理结果 获取图像,以startActivityForResult()方式获取,在activity回调中获取相应图片,获取单面和正反两面的处理代码如下:

//调用扫描页,获取身份证正面图 if (it != null) { startActivityForResult(it, PayegisAuthSDK.LF_SCAN_ID_CARD_FRONT_REQUEST); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); boolean needBothSide = false; if (data != null) { needBothSide = data.getBooleanExtra(PayegisAuthSDK.KEY_NEED_BOTHSIDE_IDCARD, false); } switch (requestCode) { case PayegisAuthSDK.LF_SCAN_ID_CARD_FRONT_REQUEST: if (resultCode == RESULT_OK) { if (!needBothSide) { //显示身份证正面 String frontCropBitmapPath = data.getStringExtra(PayegisAuthSDK.KEY_IMAGE_PATH); // String frontFullBitmapPath = data.getStringExtra(PayegisAuthSDK.KEY_IMAGE_FULL_PATH);//未裁剪的完整图片的路径 setImage(requestCode, frontCropBitmapPath); } else { //显示身份证正反两面 HashMap pathMap = (HashMap) data.getSerializableExtra(PayegisAuthSDK.KEY_IMAGE_PATH); // String frontFullBitmapPath = (String) pathMap.get(PayegisAuthSDK.KEY_FRONT_FULL_PATH);//未裁剪的正面完整图片的路径 // String backFullBitmapPath = (String) pathMap.get(PayegisAuthSDK.KEY_BACK_FULL_PATH);//未裁剪的反面完整图片的路径 setImage(pathMap); } } break; case PayegisAuthSDK.LF_SCAN_ID_CARD_BACK_REQUEST: if (resultCode == RESULT_OK) { if (!needBothSide) { //显示身份证反面 String backCropBitmapPath = data.getStringExtra(PayegisAuthSDK.KEY_IMAGE_PATH); // String frontFullBitmapPath = data.getStringExtra(PayegisAuthSDK.KEY_IMAGE_FULL_PATH);//未裁剪的完整图片的路径 setImage(requestCode, backCropBitmapPath); } else { //显示身份证正反两面 HashMap pathMap = (HashMap) data.getSerializableExtra(PayegisAuthSDK.KEY_IMAGE_PATH); // String frontFullBitmapPath = (String) pathMap.get(PayegisAuthSDK.KEY_FRONT_FULL_PATH);//未裁剪的正面完整图片的路径 // String backFullBitmapPath = (String) pathMap.get(PayegisAuthSDK.KEY_BACK_FULL_PATH);//未裁剪的反面完整图片的路径 setImage(pathMap); } } break; } }

[danger] 注意

如果需要获取未裁剪的完整图片,请按以上代码中注释部分获取图片路径。

step3 从本地获取相应图片

  在对应的requestCode下获取图像,在onActivityResult()回调中取出Intent,并从Intent PayegisAuthSDK.KEY_IMAGE_PATH KEY中获取图像本地路径,获取到真实图像文件,以下贴出以上参考代码setImage()方法的全部源代码。

/** * 显示身份证单面图片和保存 * * @param requestCode * @param filePath 文件路径 */ private void setImage(int requestCode, final String filePath) { try { switch (requestCode) { case PayegisAuthSDK.LF_SCAN_ID_CARD_FRONT_REQUEST: // 正面显示与保存 new Thread(new Runnable() { @Override public void run() { final Bitmap map = ImgUtil.getBitmapByPath(filePath); idCardFrontData = SDKUtil.Bitmap2Bytes(map); runOnUiThread(new Runnable() { @Override public void run() { img_id_front.setImageBitmap(map); } }); } }).start(); break; case PayegisAuthSDK.LF_SCAN_ID_CARD_BACK_REQUEST: // 反面显示与保存 new Thread(new Runnable() { @Override public void run() { final Bitmap map = ImgUtil.getBitmapByPath(filePath); idCardBackData = SDKUtil.Bitmap2Bytes(map); runOnUiThread(new Runnable() { @Override public void run() { img_id_back.setImageBitmap(map); } }); } }).start(); break; } } catch (OutOfMemoryError e) { e.printStackTrace(); } } /** * 显示身份证两面图片和保存 * * @param pathMap 文件路径 */ private void setImage(final HashMap pathMap) { try { // 正面显示与保存 new Thread(new Runnable() { @Override public void run() { String frontFilepath = (String) pathMap.get(PayegisAuthSDK.KEY_FRONT_PATH); if (!TextUtils.isEmpty(frontFilepath)) { final Bitmap frontBitmap = ImgUtil.getBitmapByPath(frontFilepath); idCardFrontData = SDKUtil.Bitmap2Bytes(frontBitmap); runOnUiThread(new Runnable() { @Override public void run() { img_id_front.setImageBitmap(frontBitmap); } }); } String backFilepath = (String) pathMap.get(PayegisAuthSDK.KEY_BACK_PATH); if (!TextUtils.isEmpty(backFilepath)) { final Bitmap backBitmap = ImgUtil.getBitmapByPath(backFilepath); idCardBackData = SDKUtil.Bitmap2Bytes(backBitmap); runOnUiThread(new Runnable() { @Override public void run() { img_id_back.setImageBitmap(backBitmap); } }); } } }).start(); } catch (OutOfMemoryError e) { e.printStackTrace(); } }

  以上代码中ImgUtil和SDKUtil为SDK Pro 中提供的工具类,您可以通过ImgUtil.getBitmapByPath(filePath)快速从本地路径获取一个Bitmap对象;通过SDKUtil.Bitmap2Bytes(map)快速将Bitmap对象转化成字节数组,以方便图像展示和上传识别。

1.4.2 识别身份证文字信息

  获取到身份证正反面图像后,可以调用SDK Pro识别接口,识别出身份证正反面信息。具体方法名:

public void recognizeIdCard(byte[] idFrontImage, byte[] idBackImage, IDCardRecognizeCallBack idCardRecognizeCallBack)

此方法有三个参数:

参数名称 类型 说明
idFrontImage byte[] 身份证正面图像
idBackImage byte[] 身份证反面图像
idCardRecognizeCallBack IDCardRecognizeCallBack 识别回调接口

  调用识别接口个,参考代码如下:

sdk.recognizeIdCard(idCardFrontData, idCardBackData, new IDCardRecognizeCallBack() { @Override public void onIDCardRecognize(IdCardInfo idCardInfo, int status, String message) { if (status == 0) { tv_name.setText(idCardInfo.getName()); tv_cardNo.setText(idCardInfo.getIdCard()); tv_cardDate.setText(idCardInfo.getValidateFrom() + "-" + idCardInfo.getValidateTo()); } else { showToast(message); } } });

  IDCardRecognizeCallBack回调接口封装了识别后的身份证文字信息,识别结束后回调此类void onIDCardRecognize(IdCardInfo idCardInfo,int status,String message)方法,当status==0时,表示识别成功,可从idCardInfo对象中取出相关信息,否则idCardInfo为null。message封装了相关描述信息。IdCardInfo对象封装了身份证文字信息,具体见下表:

名称 类型 描述
name String 姓名
idCard String 身份证号
sex String 性别
folk String 民族
birthday String 出生
address String 地址
authority String 发证机关
validateFrom String 有效期开始时间
validateTo String 有效期结束时间

1.5 银行卡识别

  SDK Pro中细化封装了银行卡识别接口,用以获取银行卡正面图,并调用相关接口识别银行卡信息。

1.5.1 银行卡正面图像获取

1.实例化PayegisAuthSDK类。

sdk = PayegisAuthSDK.getInstance();

2.调用银行卡OCR扫描页,获取银行卡正面图像,获取图像以startActivityForResult()方式获取,具体分为三步:

step1 获取相应Intent,并调用扫描页。具体方法名:

public Intent createBankCardOCRIntent(Context context)

  调用方法createBankCardOCRIntent (),获取相应Intent。参考代码:

//获取银行卡OCR Intent Intent it = sdk.createBankCardOCRIntent(this); //调用扫描页,获取银行卡正面图 if (it != null) { startActivityForResult(it, PayegisAuthSDK.LF_SCAN_BANK_CARD_REQUEST); }

  startActivityForResult ()方法第二个参数指定了获取银行卡正面图像,其具体定义在PayegisAuthSDK常量中,对于银行卡OCR主要有1个常量定义:

常量名称 定义
PayegisAuthSDK.LF_SCAN_BANK_CARD_REQUEST 获取银行卡正面

step2 调用扫描页,并处理结果

  获取图像,以startActivityForResult()方式获取,在activity回调中获取相应图片,参考代码:

@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (PayegisAuthSDK.LF_SCAN_BANK_CARD_REQUEST == requestCode && resultCode == RESULT_OK) { final String filePath = data.getStringExtra(PayegisAuthSDK.KEY_IMAGE_PATH); new Thread(new Runnable() { @Override public void run() { final Bitmap map = ImgUtil.getBitmapByPath(filePath); bankCardData = SDKUtil.Bitmap2Bytes(map); runOnUiThread(new Runnable() { @Override public void run() { bankcardImg.setImageBitmap(map); } }); } }).start(); } }

step3 从本地获取相应图片

  在对应的requestCode下获取图像,在onActivityResult()回调中取出Intent,并从Intent PayegisAuthSDK.KEY_IMAGE_PATH KEY中获取图像本地路径,获取到真实图像文件。以上代码中ImgUtil和SDKUtil为SDK Pro 中提供的工具类,您可以通过ImgUtil.getBitmapByPath(filePath)快速从本地路径获取一个Bitmap对象,通过SDKUtil.Bitmap2Bytes(map)快速将Bitmap对象转化成字节数组,以方便图像展示和上传识别。

1.5.2 识别银行卡

  获取到银行卡正面图像后,可以调用SDK Pro银行卡识别接口,识别出银行卡信息。具体方法名:

public void recognizeBankCard(byte[] bankCardImage, BankCardRecognizeCallBack bankCardRecognizeCallBack)

此方法有两个个参数:

参数名称 类型 说明
bankCardImage byte[] 银行卡正面图像
bankCardRecognizeCallBack BankCardRecognizeCallBack 识别回调接口

  调用识别接口个,参考代码如下:

sdk.recognizeBankCard(bankCardData, new BankCardRecognizeCallBack() { @Override public void onBankCardRecognize(BankCardOCRInfo bankCardOCRInfo, int status, String message) { if (status == 0) { bankcardBank.setText(bankCardOCRInfo.getBankName()); bankcardNo.setText(bankCardOCRInfo.getCardNo()); bankcardType.setText(bankCardOCRInfo.getCardType()); } else { showToast(message); } }});

IDCardRecognizeCallBack回调接口封装了识别后的银行卡信息,识别结束后回调此类

void onBankCardRecognize(BankCardOCRInfo bankCardOCRInfo, int status, String message)

方法,当status==0时,表示识别成功,可从bankCardOCRInfo对象中取出相关信息,否则bankCardOCRInfo为null。message封装了相关描述信息。BankCardOCRInfo对象封装了银行卡信息,具体见下表:

名称 类型 描述
bankName String 发卡行
cardNo String 银行卡号
cardType String 卡类型

1.6 驾驶证识别

  SDK Pro中细化封装了驾驶证识别接口,用以获取驾驶证图片,并调用相关接口识别银行卡信息。

1.6.1 驾驶证图像获取

1.实例化PayegisAuthSDK类。

sdk = PayegisAuthSDK.getInstance();

2.调用驾驶证OCR扫描页,获取驾驶证图像,获取图像以startActivityForResult()方式获取,具体分为三步:

step1 获取相应Intent,并调用扫描页。具体方法名:

public Intent createCommonOCRIntent(Context context)

  调用方法createCommonOCRIntent (),获取相应Intent。参考代码:

//获取通用OCR Intent Intent it = sdk.createCommonOCRIntent(this); //调用扫描页,获取图片 if (it != null) { startActivityForResult(it, PayegisAuthSDK.LF_SCAN_COMMON_REQUEST); }

  startActivityForResult ()方法第二个参数指定了获取通用图像,其具体定义在PayegisAuthSDK常量中,对于通用OCR主要有1个常量定义:

常量名称 定义
PayegisAuthSDK.LF_SCAN_COMMON_REQUEST 获取通用图片

step2 调用扫描页,并处理结果

  获取图像,以startActivityForResult()方式获取,在activity回调中获取相应图片,参考代码:

@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (PayegisAuthSDK.LF_SCAN_COMMON_REQUEST == requestCode && resultCode == RESULT_OK) { filePath = data.getStringExtra(PayegisAuthSDK.KEY_IMAGE_PATH); new Thread(new Runnable() { @Override public void run() { final Bitmap map = ImgUtil.getBitmapByPath(filePath); bitmapData = SDKUtil.Bitmap2Bytes(map); runOnUiThread(new Runnable() { @Override public void run() { mDemo_img_drive_ocr.setImageBitmap(map); } }); } }).start(); } }

step3 从本地获取相应图片

  在对应的requestCode下获取图像,在onActivityResult()回调中取出Intent,并从Intent PayegisAuthSDK.KEY_IMAGE_PATH KEY中获取图像本地路径,获取到真实图像文件。以上代码中ImgUtil和SDKUtil为SDK Pro 中提供的工具类,您可以通过ImgUtil.getBitmapByPath(filePath)快速从本地路径获取一个Bitmap对象,通过SDKUtil.Bitmap2Bytes(map)快速将Bitmap对象转化成字节数组,以方便图像展示和上传识别。

1.6.2 识别驾驶证

  获取到驾驶证图像后,可以调用SDK Pro驾驶证识别接口,识别出驾驶证信息。具体方法名:

public void recognizeDriveLicense(byte[] driveImage, DriveLicenseRecognizeCallBack driveLicenseRecognizeCallBack)

此方法有两个个参数:

参数名称 类型 说明
driveImage byte[] 驾驶证图像
driveLicenseRecognizeCallBack DriveLicenseRecognizeCallBack 识别回调接口

  调用识别接口,参考代码如下:

sdk.recognizeDriveLicense(bitmapData, new DriveLicenseRecognizeCallBack() { @Override public void onDriveLicenseRecognize(DriveLicenseOCRInfo driveLicenseOCRInfo, int status, String message) { if (status == 0) { mDemo_drive_name.setText(driveLicenseOCRInfo.getName()); mDemo_drive_no.setText(driveLicenseOCRInfo.getCertNo()); mDemo_drive_sex.setText(driveLicenseOCRInfo.getSex()); mDemo_drive_nation.setText(driveLicenseOCRInfo.getNationality()); mDemo_drive_address.setText(driveLicenseOCRInfo.getAddress()); mDemo_drive_birthday.setText(driveLicenseOCRInfo.getBirthday()); mDemo_drive_get_day.setText(driveLicenseOCRInfo.getGetCertTime()); mDemo_drive_type.setText(driveLicenseOCRInfo.getType()); mDemo_drive_effect_day.setText(driveLicenseOCRInfo.getValidateFrom() + "-" + driveLicenseOCRInfo.getValidateTo()); mDemo_drive_effect_year.setText(driveLicenseOCRInfo.getValidateTime()); } else { showToast(message); } } });

DriveLicenseRecognizeCallBack回调接口封装了识别后的驾驶证信息,识别结束后回调此类

public void onDriveLicenseRecognize(DriveLicenseOCRInfo driveLicenseOCRInfo, int status, String message)

方法,当status==0时,表示识别成功,可从driveLicenseOCRInfo对象中取出相关信息,否则driveLicenseOCRInfo为null。message封装了相关描述信息。DriveLicenseOCRInfo对象封装了驾驶证信息,具体见下表:

名称 类型 描述
name String 姓名
certNo String 证号
sex String 性别
nationality String 国籍
address String 住址
birthday String 出生日期
getCertTime String 初次领证日期
type String 准驾车型
validateFrom String 有效开始日期
validateTo String 有效结束日期
validateTime String 有效年限

1.7 行驶证识别

  SDK Pro中细化封装了行驶证识别接口,用以获取行驶证图片,并调用相关接口识别行驶证信息。

1.7.1 行驶证图像获取

1.实例化PayegisAuthSDK类。

sdk = PayegisAuthSDK.getInstance();

2.调用行驶证OCR扫描页,获取行驶证图像,获取图像以startActivityForResult()方式获取,具体分为三步:

step1 获取相应Intent,并调用扫描页。具体方法名:

public Intent createCommonOCRIntent(Context context)

  调用方法createCommonOCRIntent (),获取相应Intent。参考代码:

//获取通用OCR Intent Intent it = sdk.createCommonOCRIntent(this); //调用扫描页,获取图片 if (it != null) { startActivityForResult(it, PayegisAuthSDK.LF_SCAN_COMMON_REQUEST); }

  startActivityForResult ()方法第二个参数指定了获取通用图像,其具体定义在PayegisAuthSDK常量中,对于通用OCR主要有1个常量定义:

常量名称 定义
PayegisAuthSDK.LF_SCAN_COMMON_REQUEST 获取通用图片

step2 调用扫描页,并处理结果

  获取图像,以startActivityForResult()方式获取,在activity回调中获取相应图片,参考代码:

@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (PayegisAuthSDK.LF_SCAN_COMMON_REQUEST == requestCode && resultCode == RESULT_OK) { filePath = data.getStringExtra(PayegisAuthSDK.KEY_IMAGE_PATH); new Thread(new Runnable() { @Override public void run() { final Bitmap map = ImgUtil.getBitmapByPath(filePath); bitmapData = SDKUtil.Bitmap2Bytes(map); runOnUiThread(new Runnable() { @Override public void run() { mDemo_img_vehicle_ocr.setImageBitmap(map); } }); } }).start(); } }

step3 从本地获取相应图片

  在对应的requestCode下获取图像,在onActivityResult()回调中取出Intent,并从Intent PayegisAuthSDK.KEY_IMAGE_PATH KEY中获取图像本地路径,获取到真实图像文件。以上代码中ImgUtil和SDKUtil为SDK Pro 中提供的工具类,您可以通过ImgUtil.getBitmapByPath(filePath)快速从本地路径获取一个Bitmap对象,通过SDKUtil.Bitmap2Bytes(map)快速将Bitmap对象转化成字节数组,以方便图像展示和上传识别。

1.7.2 识别行驶证

  获取到行驶证图像后,可以调用SDK Pro行驶证识别接口,识别出行驶证信息。具体方法名:

public void recognizeVehicleLicense(byte[] vehicleImage, VehicleLicenseRecognizeCallBack vehicleLicenseRecognizeCallBack)

此方法有两个个参数:

参数名称 类型 说明
vehicleImage byte[] 行驶证图像
vehicleLicenseRecognizeCallBack VehicleLicenseRecognizeCallBack 识别回调接口

  调用识别接口,参考代码如下:

sdk.recognizeVehicleLicense(bitmapData, new VehicleLicenseRecognizeCallBack() { @Override public void onVehicleLicenseRecognize(VehicleLicenseOCRInfo vehicleLicenseOCRInfo, int status, String message) { if (status == 0) { mDemo_vehicle_no.setText(vehicleLicenseOCRInfo.getPlate()); mDemo_vehicle_type.setText(vehicleLicenseOCRInfo.getCarType()); mDemo_vehicle_name.setText(vehicleLicenseOCRInfo.getName()); mDemo_vehicle_address.setText(vehicleLicenseOCRInfo.getAddress()); mDemo_vehicle_use_type.setText(vehicleLicenseOCRInfo.getUseType()); mDemo_vehicle_car_type.setText(vehicleLicenseOCRInfo.getBrand()); mDemo_vehicle_recognize_no.setText(vehicleLicenseOCRInfo.getNickNo()); mDemo_vehicle_engine_no.setText(vehicleLicenseOCRInfo.getEngine()); mDemo_vehicle_reg_day.setText(vehicleLicenseOCRInfo.getRegisterDate()); mDemo_vehicle_get_day.setText(vehicleLicenseOCRInfo.getCertDate()); } else { showToast(message); } } });

VehicleLicenseRecognizeCallBack回调接口封装了识别后的行驶证信息,识别结束后回调此类

public void onVehicleLicenseRecognize(VehicleLicenseOCRInfo vehicleLicenseOCRInfo, int status, String message)

方法,当status==0时,表示识别成功,可从vehicleLicenseOCRInfo对象中取出相关信息,否则vehicleLicenseOCRInfo为null。message封装了相关描述信息。VehicleLicenseOCRInfo对象封装了行驶证信息,具体见下表:

名称 类型 描述
plate String 号牌号码
carType String 车辆类型
name String 所有人
address String 住址
useType String 使用性质
brand String 品牌型号
nickNo String 车辆识别代码
engine String 发动机号码
registerDate String 注册日期
certDate String 发证日期

1.8 活体检测

  SDK Pro中细化封装了活体检测接口,用以获取用户实景头像,活体检测过程中需要用户做随机n组动作或者自定义n组动作(1<=n<=6),最终取得一张用户实景头像。具体使用方法分为以下几步:

step1 初始化PayegisAuthSDK

sdk = PayegisAuthSDK.getInstance(); Config.appName = "payegispro-face-android";

  其中特别注意的是:Config.appName = "payegispro-face-android";

调用活体检测需要给APP授权,因此需要配置SDK的Config.appName参数,具体命名规则:

  yourAPPName +“-face-android” appName为申请账户时,提交给远程实名管理平台的应用名称。

step2 获取相应Intent,并调用扫描页。具体方法名:

public Intent createRandomLivenessIntent(Context context, int randomNumber)

调用方法createRandomLivenessIntent (),获取相应Intent。

//获取活体检测 Intent,以随机的方式 Intent it = sdk.createRandomLivenessIntent(this, 2);

  createRandomLivenessIntent()方法第二个参数指定了活体检测随机动作个数,互不重复,SDK一共提供了6种动作。这些动作被定义在FaceLivenessTypeHelper类常量中。

常量名 说明
EYE 眨眨眼
MOUTH 张嘴
HEAD_LEFT 左摇头
HEAD_RIGHT 右摇头
HEAD_UP 抬头
HEAD_DOWN 点头

  如果您期望自定义动作,可以用以下函数完成定义:

public Intent createLivenessIntent(Context context, int[] liveness)

int[] liveness为动作数组,其动作类型必须符合FaceLivenessTypeHelper类中列出的常量,请参见上表。代码示例如下:

//自定义动作顺序 int[] liveness = {FaceLivenessTypeHelper.HEAD_DOWN,FaceLivenessTypeHelper.EYE}; Intent it = sdk.createLivenessIntent(this, liveness);

step3 调用扫描页,并处理结果   获取图像,以startActivityForResult()方式获取,相应的requestCode为:PayegisAuthSDK.KEY_TO_DETECT_REQUEST_CODE,对应的在activity回调中获取相应图片,参考代码:

//调用扫描页 if (it != null) { startActivityForResult(it, PayegisAuthSDK.KEY_TO_DETECT_REQUEST_CODE); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (PayegisAuthSDK.KEY_TO_DETECT_REQUEST_CODE == requestCode && resultCode == PayegisAuthSDK.LIVE_RESULT_SUCCESS_CODE) { new Thread(new Runnable() { @Override public void run() { final Bitmap map = ImgUtil.bytesToBimap(PayegisAuthSDK.bestFaceData); runOnUiThread(new Runnable() { @Override public void run() { faceImg.setImageBitmap(map); } }); } }).start(); } }

step4 从本地获取相应图片。

  在对应的requestCode下获取图像,在onActivityResult()回调中利用PayegisAuthSDK.bestFaceData KEY中获取图像字节数组,获取到真实图像文件。以上代码中ImgUtil SDK Pro 中提供的工具类,您可以通过ImgUtil.bytesToBimap (PayegisAuthSDK.bestFaceData)快速将图片数组转换成Bitmap对象,以供展示。

1.9 指纹识别

  SDK Pro中封装了系统指纹识别。具体使用方法分为以下几步:

step1 初始化PayegisAuthSDK

sdk = PayegisAuthSDK.getInstance();

step2 调用verifyFingerPrint(String accountName, String businessNO, FingerPrintCallBack var1)方法开始识别,参数accountName为用户唯一标示(不能含有中文和特殊字符),参数businessNO为本次识别事务号(不能含有中文和特殊字符),识别结果通过FingerPrintCallBack接口回调:

String account = "payegis001"; String businessNo = getRadomNO(10); sdk.verifyFingerPrint(account, businessNo, new FingerPrintCallBack() { @Override public void onCheckServiceFailed(int i, String s) { } @Override public void onAuthenticationError(int i, CharSequence charSequence) { } @Override public void onAuthenticationHelp(int i, CharSequence charSequence) { } @Override public void onAuthenticationSucceeded() { } @Override public void onAuthenticationFailed() { } });

  回调方法说明如下:

方法 说明
onCheckServiceFailed(int code, String message) 当没有设指纹模块或没有录入可用指纹时调用
onAuthenticationError(int errorCode, CharSequence errString) 当遇到不可恢复的错误并且操作完成时调用。调用后不会再有后续回调。
onAuthenticationHelp(int helpCode, CharSequence helpString) 在认证期间遇到可恢复的错误时调用。帮助文字提供给用户指导哪里出了问题,例如“传感器脏,请清洁它”。
onAuthenticationSucceeded() 在成功识别指纹时调用。

  onCheckServiceFailed(int code, String message)方法的第一个参数说明如下:

常量名 说明
Contants.FAILED_CODE_NO_HARDWARE 没有指纹识别模块或设备不兼容
Contants.FAILED_CODE_NO_FINGER 没有录入可用指纹

  onAuthenticationError(int code, CharSequence charSequence)方法的第一个参数说明如下:

常量名 说明
FingerprintManager.FINGERPRINT_ERROR_CANCELED 由于指纹传感器不可用,操作被取消。
FingerprintManager.FINGERPRINT_ERROR_HW_UNAVAILABLE 硬件不可用,稍后再试。
FingerprintManager.FINGERPRINT_ERROR_LOCKOUT 该操作被取消,因为尝试过多API被锁定
FingerprintManager.FINGERPRINT_ERROR_NO_SPACE 操作无法完成,因为没有足够的存储空间来完成操作。
FingerprintManager.FINGERPRINT_ERROR_TIMEOUT 运行时间过长时返回。
FingerprintManager.FINGERPRINT_ERROR_UNABLE_TO_PROCESS 传感器无法处理当前图像。
-1 其他错误。

  onAuthenticationHelp(int code, CharSequence charSequence)方法的第一个参数说明如下:

常量名 说明
FingerprintManager.FINGERPRINT_ACQUIRED_GOOD 由于指纹传感器不可用,操作被取消。
FingerprintManager.FINGERPRINT_ACQUIRED_IMAGER_DIRTY 由于怀疑或检测到传感器上有污垢,指纹图像过于嘈杂。
FingerprintManager.FINGERPRINT_ACQUIRED_INSUFFICIENT 由于检测到的条件(如皮肤干燥)或可能脏的传感器,指纹图像过于嘈杂而无法处理。
FingerprintManager.FINGERPRINT_ACQUIRED_PARTIAL 只检测到部分指纹图像。
FingerprintManager.FINGERPRINT_ACQUIRED_TOO_FAST 由于运动过快,指纹图像不完整。
FingerprintManager.FINGERPRINT_ACQUIRED_TOO_SLOW 指纹图像由于缺乏运动而不可读。

  如果要取消当前验证,调用如下方法:

sdk.cancelFingerPrint();

1.10 权限说明

  远程实名认证SDK Pro需要获取系统相关权限,在使用SDK时,需要动态获取以下4个权限,否则SDK将无法正常使用。

名称 描述
READ_PHONE_STATE 读取手机状态
WRITE_EXTERNAL_STORAGE 读写磁盘
CAMERA 使用相机
USE_FINGERPRINT 使用指纹

  授权参考代码如下:

/** * 申请权限 */ private void initPermission() { ArrayList<String> perList = new ArrayList<>(); if (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { perList.add(Manifest.permission.READ_PHONE_STATE); } if (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { perList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); } if (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { perList.add(Manifest.permission.CAMERA); } if (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.USE_FINGERPRINT) != PackageManager.PERMISSION_GRANTED) { perList.add(Manifest.permission.USE_FINGERPRINT); } if (perList.size() > 0) { String[] perArr = new String[perList.size()]; perList.toArray(perArr); ActivityCompat.requestPermissions(this, perArr, 100); } }

1.11 混淆说明

  远程实名认证SDK已经经过混淆,所以在打包时添加以下忽略:

-dontwarn com.** -dontwarn cn.** -dontwarn org.** -dontwarn android.** -dontwarn android.support.** -dontwarn org.apache.** -keep public class cn.payegis.authsdk.** { *;} -keep public class com.payegis.face.** { *;} -keep public class com.payegis.idl.** { *;} -keep public class com.payegis.ocr.** { *;} -keep class com.payegis.caesar.sdk.** {*;} -keep class com.payegis.monitor.sdk.** {*;} -keep public class com.baidu.**{ *;}

results matching ""

    No results matching ""

    results matching ""

      No results matching ""