简介
身份证识别,银行卡识别,能够减少人为输入带来的麻烦和失误,所以有特定的需求。百度OCR
目前还是免费的,所以有一定的吸引力。
百度OCR Android SDK 快速入门
如何集成?
- 既然要集成百度
OCR SDK
,那么就要去百度网站下载相应的包。
百度OCR SDK下载地址
- 下载完成后,得到zip压缩包,解压后是这样的:
- 按照接入说明文档接入。Android 接入文档
-
import android.support.v4.app.ActivityCompat;
导入失败问题。
这是因为现在的工程默认是采用androidx
系列的包,但是百度OCR
用的还是support
类型的包
Android Studio无法导入android.support.v4.app.Fragment
(1)将gradle.properties
中关于androidx
的选项关闭
(2)很多依赖的androidx
系列的包要改为support
类型的包
(3)布局文件也要改
企业微信截图_9b37c7ac-d5d0-40b2-8357-9266b1205afd.png- Proguard配置
-keep class com.baidu.ocr.sdk.**{*;}
-dontwarn com.baidu.ocr.**
- 登录百度账号管理中心,下载授权文件
- 将授权文件导入工程,放在
asset
目录下
切换到Project
标签,在main
下选择菜单New -> Folder -> assets Folder
,创建资源文件夹
Android Studio中新建和引用assets文件
将下载的授权文件复制到asset
文件夹下
在Android
标签下也能看到
如何使用?
初始化
也就是读取授权文件进行身份验证。这个可以在程序入口CashierApplication
中完成。并且为了不影响启动速度,开辟新线程,并且延时执行。
// 初始化三方库
private void sdkInitial() {
// 延时执行
new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
@Override
public void run() {
// 百度,图片识别
OCR.getInstance(CashierApplication.this).initAccessToken(new OnResultListener<AccessToken>() {
@Override
public void onResult(AccessToken accessToken) {
Log.d("OCR", "accessToken:"+accessToken);
}
@Override
public void onError(OCRError ocrError) {
Log.e("OCR","ocrError:"+ocrError);
}
}, getApplicationContext());
}
}, 500);
}
由于验证身份需要连接网络,所以需要开启网络权限,而ocr_ui
工程没有申请网络权限申请,所以会报错。
而网络权限是通用的一种权限,直接加在主工程比较方便。
企业微信截图_91b261e8-bf6e-4ee9-af47-25eb63ea010e.png识别界面
-
嵌入的工程
ocr_ui
提供了识别时候的拍摄界面,以startActivityForResult
调用。 -
图片拍摄之后,图片需要一个缓存的路径,比如采用最简单的系统提供的路径
String filePath = getFilesDir().getAbsolutePath() + File.separator + "ocr" + File.separator;
// 这是目录,要创建一下,不然下面的文件会不存在
File directory = new File(filePath);
if (!directory.exists() || directory.isFile()) {
directory.mkdir();
}
-
类别通过Intent的参数设置,区分身份证正面,身份证方面,银行卡等
-
在
onActivityResult
中获取识别后的图片的数据,从预先设置的filePath
中获取。 -
调用相关的API接口,获取相应的参数,比如姓名,身份证号,银行卡号等。
银行卡
- 展示拍摄界面
String filePath = getFilesDir().getAbsolutePath() + File.separator + "ocr" + File.separator;
// 这是目录,要创建一下,不然下面的文件会不存在
File directory = new File(filePath);
if (!directory.exists() || directory.isFile()) {
directory.mkdir();
}
mBankCardImagePath = filePath + "bank_card.jpg";
// 生成intent对象
intent = new Intent(UploadIdentifyActivity.this, CameraActivity.class);
// 设置临时存储
intent.putExtra(CameraActivity.KEY_OUTPUT_FILE_PATH, mBankCardImagePath);
// 设置类型
intent.putExtra(CameraActivity.KEY_CONTENT_TYPE, CameraActivity.CONTENT_TYPE_BANK_CARD);
// 启动拍摄界面
startActivityForResult(intent, BANK_CARD);
- 处理结果
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// 银行卡数据
try {
BankCardParams param = new BankCardParams();
param.setImageFile(new File(mBankCardImagePath));
OCR.getInstance(getApplicationContext()).recognizeBankCard(param, new OnResultListener<BankCardResult>() {
@Override
public void onResult(BankCardResult bankCardResult) {
if (null != bankCardResult) {
Log.d("BANK_CARD:", bankCardResult.getBankName() + bankCardResult.getBankCardNumber());
mBankCardView.setText("银行名称:" + bankCardResult.getBankName() + "===卡号:" + bankCardResult.getBankCardNumber()
+ "===类型:" + bankCardResult.getBankCardType());
}
}
@Override
public void onError(OCRError ocrError) {
Toast.makeText(getApplicationContext(), "识别银行卡失败", Toast.LENGTH_LONG);
}
});
} catch (Throwable e) {
e.printStackTrace();
}
有可能崩溃,要用
try catch
包一下
网友评论