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 |
指纹图像由于缺乏运动而不可读。 |
如果要取消当前验证,调用如下方法:
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.**{ *;}