美文网首页
Android: 集成百度OCR实践 2020-06-18

Android: 集成百度OCR实践 2020-06-18

作者: 勇往直前888 | 来源:发表于2020-06-24 17:59 被阅读0次

    简介

    身份证识别,银行卡识别,能够减少人为输入带来的麻烦和失误,所以有特定的需求。百度OCR目前还是免费的,所以有一定的吸引力。
    百度OCR Android SDK 快速入门

    如何集成?

    企业微信截图_8336a74d-26f2-4e81-b1c7-d5785e0659a5.png
    • 下载完成后,得到zip压缩包,解压后是这样的:
    企业微信截图_9033a2c8-9f16-4e40-9d07-f4ab8eeb7f9f.png
    • import android.support.v4.app.ActivityCompat;导入失败问题。

    这是因为现在的工程默认是采用androidx系列的包,但是百度OCR用的还是support类型的包
    Android Studio无法导入android.support.v4.app.Fragment

    (1)将gradle.properties中关于androidx的选项关闭

    企业微信截图_af2dfeee-4b8c-4b8d-ac83-e94f470938b9.png

    (2)很多依赖的androidx系列的包要改为support类型的包

    企业微信截图_edab803e-82a4-4a95-9a20-698e7b9392d1.png

    (3)布局文件也要改

    企业微信截图_9b37c7ac-d5d0-40b2-8357-9266b1205afd.png
    • Proguard配置
    -keep class com.baidu.ocr.sdk.**{*;}
    -dontwarn com.baidu.ocr.**
    

    Android 混淆配置及Proguard用法

    • 登录百度账号管理中心,下载授权文件
    企业微信截图_1dcb1853-f70c-41ff-a19a-9b40b905728b.png 企业微信截图_8aafe21d-23b6-46b0-b4a6-2f4825314109.png
    • 将授权文件导入工程,放在asset目录下

    切换到Project标签,在main下选择菜单New -> Folder -> assets Folder,创建资源文件夹
    Android Studio中新建和引用assets文件

    企业微信截图_0639b0e9-917c-45e1-ac54-bab9c5804d9e.png

    将下载的授权文件复制到asset文件夹下

    企业微信截图_9ef96759-a86c-4099-ab53-3856b30928c0.png

    Android标签下也能看到

    企业微信截图_84f428c5-a97a-4026-9800-d4470ccf1394.png

    如何使用?

    初始化

    也就是读取授权文件进行身份验证。这个可以在程序入口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工程没有申请网络权限申请,所以会报错。

    企业微信截图_f7050b4a-b3a3-4f75-b482-8a8576c37ff3.png

    而网络权限是通用的一种权限,直接加在主工程比较方便。

    企业微信截图_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包一下

    接口调用说明

    相关文章

      网友评论

          本文标题:Android: 集成百度OCR实践 2020-06-18

          本文链接:https://www.haomeiwen.com/subject/gioyxktx.html