百度平台注册
百度ocr网址
https://cloud.baidu.com/?from=console
点击文字识别,创建新的应用
代码集成
- 前往SDK下载页面下载Android SDK压缩包。
- (必须)将下载包libs目录中的ocr-sdk.jar文件拷贝到工程libs目录中,并加入工程依赖。
- (必须)将libs目录下armeabi,arm64-v8a,armeabi-v7a,x86文件夹按需添加到android studio工程
src/main/jniLibs
目录中, eclipse用户默认为libs目录。 -
(可选)如果需要使用UI模块,请在Android studio中以模块方式导入下载包中的ocr-ui文件夹。
如果要使用原有的UI,请在工程的build.graldle中添以下依赖
implementation 'com.github.wenchaosong:OCR_identify:3.0.8'
如果builder不成功,项目的builder.gradler中的repositories 添加
maven { url "https://jitpack.io" }
allprojects {
repositories {
google()
jcenter()
maven { url "https://jitpack.io" }
}
}
Maven是一个采用纯Java编写的开源项目管理工具。
**远程仓库**:[https://jitpack.io](https://jitpack.io/)
加这句话的意思是从远程仓库上下载这个开源项目
为您自己的工程添加必要的权限
如果您在自己的工程中集成SDK,请确保已经在工程AndroidManifest.xml文件中添加如下权限:
<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"/>
各个权限的用途说明见下表:
名称 | 用途 |
---|---|
INTERNET | 应用联网,发送请求数据至服务器,获得识别结果。 |
CAMERA | 调用相机进行拍照(仅UI部分需要) |
WRITE_EXTERNAL_STORAGE | 图片裁剪临时存储 |
READ_EXTERNAL_STORAGE | 图片裁剪临时存储 |
在应用详情页面查看并复制应用的Api Key(简称AK) 和 Secret Key(简称SK),初始化OCR单例:
写在自己的Application中
OCR.getInstance().initAccessTokenWithAkSk(new OnResultListener<AccessToken>() {
@Override
public void onResult(AccessToken result) {
// 调用成功,返回AccessToken对象
String token = result.getAccessToken();
}
@Override
public void onError(OCRError error) {
// 调用失败,返回OCRError子类SDKError对象
}
}, getApplicationContext(), "您的应用AK", "您的应用SK");
在需要调用的地方写下这个代码,这是调用
private int idType; //身份证类型,0:正面,1:反面
// 调用拍摄身份证正面(带本地质量控制)activity
private void scanFrontWithNativeQuality(int idType) {
Intent intent = new Intent(this, CameraActivity.class);
intent.putExtra(CameraActivity.KEY_OUTPUT_FILE_PATH, FileUtils.getSaveFile(getApplication()).getAbsolutePath());
// intent.putExtra(CameraActivity.KEY_OUTPUT_FILE_PATH, FileUtils.createFile(getDataDir()+"saomiao",".png"));
intent.putExtra(CameraActivity.KEY_NATIVE_ENABLE, true);
// KEY_NATIVE_MANUAL设置了之后CameraActivity中不再自动初始化和释放模型
// 请手动使用CameraNativeHelper初始化和释放模型
// 推荐这样做,可以避免一些activity切换导致的不必要的异常
//使用本地质量控制能力需要授权
intent.putExtra(CameraActivity.KEY_NATIVE_TOKEN, OCR.getInstance(this).getLicense());
//设置扫描的身份证的类型(正面front还是反面back)
if (idType == 0) {
intent.putExtra(CameraActivity.KEY_CONTENT_TYPE, CameraActivity.CONTENT_TYPE_ID_CARD_FRONT);
} else {
intent.putExtra(CameraActivity.KEY_CONTENT_TYPE, CameraActivity.CONTENT_TYPE_ID_CARD_BACK);
}
startActivityForResult(intent, REQUEST_CODE_CAMERA);
}
这里是扫描带回来的参数,扫描会走到onActivityResult中,我们只需要在这里进行处理
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);
file = FileUtils.getSaveFile(getApplicationContext());
if (!TextUtils.isEmpty(contentType)) {
if (CameraActivity.CONTENT_TYPE_ID_CARD_FRONT.equals(contentType)) {
recIDCard(IDCardParams.ID_CARD_SIDE_FRONT, file.getAbsolutePath());
} else if (CameraActivity.CONTENT_TYPE_ID_CARD_BACK.equals(contentType)) {
recIDCard(IDCardParams.ID_CARD_SIDE_BACK, file.getAbsolutePath());
}
}
}
}
}
回传回来的数据我们在这个方法里进行解析
private void recIDCard(final String idCardSide, final String filePath) {
IDCardParams param = new IDCardParams();
param.setImageFile(new File(filePath));
// 设置身份证正反面
param.setIdCardSide(idCardSide);
// 设置方向检测
param.setDetectDirection(true);
// 设置图像参数压缩质量0-100, 越大图像质量越好但是请求时间越长。 不设置则默认值为20
param.setImageQuality(20);
/* mIvBtnBackgrod.setImageURI(Uri.fromFile(new File(filePath)));*/
OCR.getInstance(this).recognizeIDCard(param, new OnResultListener<IDCardResult>() {
@Override
public void onResult(IDCardResult result) {
if (result != null) {
if (IDCardParams.ID_CARD_SIDE_FRONT.equals(idCardSide)) {
//身份证姓名
name = result.getName().getWords();
//身份证号
idnum = result.getIdNumber().getWords();
//地址
addressDetail = result.getAddress().getWords();
} else if (IDCardParams.ID_CARD_SIDE_BACK.equals(idCardSide)) {
//身份证有效期开始的时间
beginDate = result.getSignDate().getWords();
//身份证有效期结束的时间
endDate = result.getExpiryDate().getWords();
//签证机关
addres = result.getIssueAuthority().getWords();
}
}
}
@Override
public void onError(OCRError error) {
ToastUitl.show(error.getMessage(), 0);
}
});
}
如果使用了百度的扫描UI,启用了百度的CameraActivity,一定要在AndroidMainfist中注册
<activity android:name="com.baidu.ocr.ui.camera.CameraActivity"/>