一:简介
快捷支付涉及到方方面面,同时安全问题既是用户所关心的,也是制作者不容忽视的重要部分。
比如涉及到支付和金钱的app,商户端app等等,都需要进行实名认证,实名认证可以通过银行卡认证和身份证认证。
通常办法是通过上传照片,并且手动输入基本信息进行认证,这种方法不仅操作复杂,而且容易出错。
网上很多资源,识别率低,速度慢,用户体验很差。今天我就和大家介绍一下我使用的方法,可以快速、高效的识别中国身份证信息。
二:原理
在拍摄框中右上区域加了一个人像区域提示框,并将该区域设为扫描人脸的区域,只有该区域扫描到身份证上的人脸时(确保用户的确将身份证人像对准了拍摄框中的人像框),才执行读取身份证信息的操作。
三:项目展示
扫描身份证面截图


信息展示页面


四: 使用流程介绍
4.1 身份验证
由于使用的是百度云的图像文字识别sdk,首先需要去百度云管理控制台获得API Key / Secret Key。


4.2 下载demo
- 将下载的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模块名1 include ':app',':identify' 
然后直接复制粘贴identify文件导入到项目的文件夹中!!!然后Build>Rebuild Project,重新构建项目。
4.3 权限配置
- 在工程AndroidManifest.xml文件中添加如下权限: - 1 
 2
 3
 4- <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"/>
- 在Proguard配置文件中增加, 防止release发布时打包报错: - 1 
 2- -keep class com.baidu.ocr.sdk.**{*;} 
 -dontwarn com.baidu.ocr.**
4.4 核心函数介绍
- 初始化函数 - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12- 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");
- 身份证拍照 
| 1 | Intent intent = new Intent(MainActivity.this, CameraActivity.class); | 
- 图像回调 - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18- @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);
 }
 }
 }
 }
 }
- 数据解析 - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19- 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可联系我。
公众号:网罗开发

 
        