[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sw4wmrCf-1653469416405)(https://files.mdnice.com/user/18521/be6aa234-23ee-443c-8999-138d189c024c.png)]
建议建两个应用,一个测试一个真实项目,测试应用的包名用com.baidu.ocr.demo,因为之后我们下载sdk默认的包名就是这个。
签名MD5值获取:
我们用AndroidStudio创建一个签名文件,如果之前创建过就可以用之前的,记录下key store path的位置,后面生成签名MD5值需要用到
通过cmd命令进入本地jdk的bin目录
输入命令查看keystore.jks的MD5值,将E:\askey\keystore.jks改为自己签名文件实际位置即可
keytool -list -v -keystore E:\askey\keystore.jks
然后在输入签名文件的密码即可查看MD5值
Lincense下载后备用一会可以替换到Android工程中的assets文件夹下,注意文件名不能改变
注意,包名改变或者签名MD5值改变,都需要重新下载Lincense文件重新替换到assets文件下,否则会提示token还未成功获取
解压上一步下载的SDK包,拿到OCRDemo文件夹,并将下载的aip-ocr.license文件替换到assets文件下,成功运行demo后,我们测试功能需要对demo进行签名打包,选择我们获取到签名MD5值的签名文件,并进行打包,打包成功后即可发现能正常使用ocr识别功能。
我的项目实际需要的是文字识别及二维码识别,在app文件下的build.gradle中添加如下依赖
implementation(name: 'ocrsdk', ext: 'aar')
implementation project(path: ':ocr_ui')
我们直接用百度的相机UI进行识别,开发工作量减轻不少
在项目中调用百度相机
private void imgToTextByOCR() {
if (!checkTokenStatus()) {
return;
}
Intent intent = new Intent(XXActivity.this, CameraActivity.class);
intent.putExtra(CameraActivity.KEY_OUTPUT_FILE_PATH,
FileUtil.getSaveFile(getApplicationContext()).getAbsolutePath());
intent.putExtra(CameraActivity.KEY_CONTENT_TYPE,
CameraActivity.CONTENT_TYPE_GENERAL);
startActivityForResult(intent, REQUEST_CODE_ACCURATE_BASIC);
}
在onActivityResult方法中接受相机的返回值
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_ACCURATE_BASIC && resultCode == Activity.RESULT_OK) {
RecognizeService.recAccurateBasic(getApplicationContext(), FileUtil.getSaveFile(getApplicationContext()).getAbsolutePath(),
new RecognizeService.ServiceListener() {
@Override
public void onResult(String result) {
infoPopText(result);
}
});
RecognizeService.recQrcode(getApplicationContext(), FileUtil.getSaveFile(getApplicationContext()).getAbsolutePath(),
new RecognizeService.ServiceListener() {
@Override
public void onResult(String result) {
infoPopTextQR(result);
}
});
}
}
注意:这里我是对返回的数据进行了两次调用解析,recAccurateBasic是文字解析,recQrcode是二维码解析,文字和二维码解析是分开的并单独收费
private void infoPopText(final String result) {
//根据自己的业务处理文字
Toast.makeText(this, result, Toast.LENGTH_LONG).show();
}
private void infoPopTextQR(final String result) {
SystemClock.sleep(1000);
String codeStr = "";
String qrCodeStr = "";
try {
JSONObject jsonObject = new JSONObject(result);
String codeRes = jsonObject.getString("codes_result");
JSONArray jsonArray = new JSONArray(codeRes);
JSONObject jObj = jsonArray.getJSONObject(0);
if (jObj != null) {
codeStr = jObj.getString("text");
}
JSONArray jArr = new JSONArray(codeStr);
qrCodeStr = jArr.getString(0);
} catch (JSONException e) {
e.printStackTrace();
}
Toast.makeText(this, qrCodeStr, Toast.LENGTH_LONG).show();
// 解析并拿到二维码数据后,根据业务处理
if(qrCodeStr!=""){
queryQRCodeByOCR(qrCodeStr);
}
}
在识别二维码的过程中,会发现百度的相机UI裁剪框默认是设置了上下左右距离的,我们想要全屏的效果,当然如果不用百度相机UI自己调用系统相机也不是不可以。
找到FrameOverlayView文件,修改resetFrameRect方法如下
private void resetFrameRect(int w, int h) {
if (shapeType == 1) {
frameRect.left = 0;
frameRect.top = 0;
} else {
frameRect.left = 0;
frameRect.top = 0;
}
frameRect.right = w - frameRect.left;
frameRect.bottom = h - frameRect.top;
}
找到CameraActivity,增加onKeyDown事件,可以根据设备的按键键值来执行拍照方法,拍照完可以在根据设备按键键值执行确定按钮
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode > xx1&&keyCode xx3&&keyCode