Android中集成百度OCR识别健康码

文章目录

  • 1.效果图
  • 2.在百度智能云控制台创建应用
  • 3.下载SDK及License文件
  • 4.解压SDK并运行OCRDemo
  • 5.集成文字识别及二维码识别
  • 6.修改百度相机UI将裁剪框默认改为全屏
  • 7.增加设备按键拍照事件

背景:由于部分政府及企业拿不到或者申请不到健康码的相关接口数据,因此要求我们的疫情防控系统能识别健康码上的数据,基于上述需求,我在PDA设备中集成了百度OCR识别健康码的功能。

1.效果图

Android中集成百度OCR识别健康码_第1张图片

Android中集成百度OCR识别健康码_第2张图片

2.在百度智能云控制台创建应用

Android中集成百度OCR识别健康码_第3张图片

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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值需要用到
Android中集成百度OCR识别健康码_第4张图片

通过cmd命令进入本地jdk的bin目录

Android中集成百度OCR识别健康码_第5张图片

输入命令查看keystore.jks的MD5值,将E:\askey\keystore.jks改为自己签名文件实际位置即可
keytool -list -v -keystore E:\askey\keystore.jks
然后在输入签名文件的密码即可查看MD5值

Android中集成百度OCR识别健康码_第6张图片

3.下载SDK及License文件

Android中集成百度OCR识别健康码_第7张图片

Lincense下载后备用一会可以替换到Android工程中的assets文件夹下,注意文件名不能改变

Android中集成百度OCR识别健康码_第8张图片

注意,包名改变或者签名MD5值改变,都需要重新下载Lincense文件重新替换到assets文件下,否则会提示token还未成功获取

4.解压SDK并运行OCRDemo

解压上一步下载的SDK包,拿到OCRDemo文件夹,并将下载的aip-ocr.license文件替换到assets文件下,成功运行demo后,我们测试功能需要对demo进行签名打包,选择我们获取到签名MD5值的签名文件,并进行打包,打包成功后即可发现能正常使用ocr识别功能。

5.集成文字识别及二维码识别

我的项目实际需要的是文字识别及二维码识别,在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);
        }

    }

6.修改百度相机UI将裁剪框默认改为全屏

在识别二维码的过程中,会发现百度的相机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;
    }

7.增加设备按键拍照事件

找到CameraActivity,增加onKeyDown事件,可以根据设备的按键键值来执行拍照方法,拍照完可以在根据设备按键键值执行确定按钮

    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode > xx1&&keyCode xx3&&keyCode

你可能感兴趣的:(Android)