一:简介
快捷支付涉及到方方面面,同时安全问题既是用户所关心的,也是制作者不容忽视的重要部分. 比如涉及到支付和金钱的 app,商户端 app 等等,都需要进行实名认证,实名认证可以通过银行卡认证和身份证认证. 通常办法是通过上传照片,并且手动输入基本信息进行认证,这种方法不仅操作复杂,而且容易出错. 网上很多资源,识别率低,速度慢,用户体验很差.今天我就和大家介绍一下我使用的方法,可以快速,高效的识别中国身份证信息.
二:原理
在拍摄框中右上区域加了一个人像区域提示框,并将该区域设为扫描人脸的区域,只有该区域扫描到身份证上的人脸时(确保用户的确将身份证人像对准了拍摄框中的人像框),才执行读取身份证信息的操作.
三:项目展示
扫描身份证面截图
信息展示页面
四: 使用流程介绍
4.1 身份验证
由于使用的是百度云的图像文字识别 sdk,首先需要去百度云 [ 管理控制台 ](https://console.bce.baidu.com/ai/?_=1515636851708&fromai=1#/ai/ocr/app/list) 获得 API Key / Secret Key.
4.2 下载 demo
GitHub 源码链接
将下载的 demo 中 libs 目录下的 ocr-sdk.jar 文件拷贝到工程 libs 目录中,并加入工程依赖
将 libs 目录下 armeabi,arm64-v8a,armeabi-v7a,x86 文件夹按需添加到 android studio 工程 src/main/jniLibs 目录中, eclipse 用户默认为 libs 目录.
在 Android studio 中以模块方式导入下载包中的 identify 文件夹, 模块方式导入流程如下: 首先要在顶层工程目录下的 settings.gradle 文件中 include 模块名
include ':app',':identify'
然后直接复制粘贴 identify 文件导入到项目的文件夹中!!!然后 Build>Rebuild Project,重新构建项目.
4.3 权限配置
在工程 AndroidManifest.xml 文件中添加如下权限:
在 Proguard 配置文件中增加, 防止 release 发布时打包报错:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
4.4 核心函数介绍
- keep class com.baidu.ocr.sdk. * *{ * ;
} - dontwarn com.baidu.ocr. * *
初始化函数
身份证拍照
OCR.getInstance().initAccessTokenWithAkSk(new OnResultListener<AccessToken>() {
@Override
public void onResult(AccessToken result) {
}
@Override
public void onError(OCRError error) {
error.printStackTrace();
Log.d("onError", "msg: " + error.getMessage());
}
}, getApplicationContext(), "你注册的appkey", "你注册的sk");
图像回调
Intent intent = new Intent(MainActivity.this, CameraActivity.class);
intent.putExtra(CameraActivity.KEY_OUTPUT_FILE_PATH,
FileUtil.getSaveFile(getApplication()).getAbsolutePath());
intent.putExtra(CameraActivity.KEY_CONTENT_TYPE, CameraActivity.CONTENT_TYPE_ID_CARD_FRONT);
startActivityForResult(intent, REQUEST_CODE_CAMERA);
数据解析
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_CAMERA && resultCode == Activity.RESULT_OK) {
if (data != null) {
String contentType = data.getStringExtra(CameraActivity.KEY_CONTENT_TYPE);
String filePath = FileUtil.getSaveFile(getApplicationContext()).getAbsolutePath();
if (!TextUtils.isEmpty(contentType)) {
if (CameraActivity.CONTENT_TYPE_ID_CARD_FRONT.equals(contentType)) {
recIDCard(IDCardParams.ID_CARD_SIDE_FRONT, filePath);
} else if (CameraActivity.CONTENT_TYPE_ID_CARD_BACK.equals(contentType)) {
recIDCard(IDCardParams.ID_CARD_SIDE_BACK, filePath);
}
}
}
}
}
到此身份证识别接入就结束了!!!
private void recIDCard(String idCardSide, String filePath) {
IDCardParams param = new IDCardParams();
param.setImageFile(new File(filePath));
param.setIdCardSide(idCardSide);
param.setDetectDirection(true);
OCR.getInstance().recognizeIDCard(param, new OnResultListener<IDCardResult>() {
@Override
public void onResult(IDCardResult result) {
if (result != null) {
Log.d("onResult", "result: " + result.toString());
}
}
@Override
public void onError(OCRError error) {
Log.d("onError", "error: " + error.getMessage());
}
});
}
相同方式均可实现银行卡识别,驾驶证识别,行驶证识别,车牌识别,营业执照识别等等,如有需要 demo 可联系我.
希望可以帮助大家, 如有问题可加 QQ 技术交流群: 591625129
如果哪里有什么不对或者不足的地方,还望读者多多提意见或建议
来源: https://juejin.im/post/5a56d4155188257334229d4b