图文解说ChinaCock的百度OCR


今天,拿到作者集成最新的百度OCR的控件,因为以前的版本一直存在这个问题:,所以迫不及待的想用到app中,看有没有解决题。

这个版本总体来说改动不大,但关键集成最新的百度OCR android SDK,改动相对来说还是不小的。有关最新的百度OCR Android SDK的内容,可以看官方发布的 Android SDK部分的资料,作为复习的内容,建议还是先做做功课,这里我就不重复了。

官方现在发布到2.0.0版本,2022年2月17日发布,最重的就是增强了安全性,也因此需要我们去他的应用管理页面去生成一个安全文件aip-ocr.license,然后要同app一起发布出去。

如何生成并下载这个aip-ocr.license文件?

1.我现在已经在百度平台建立了应用,所以我直接来到应用列表,在这个页面中,选择一个应用,然后点“管理”,进入对应的应用详情页面::

下图为进入的应用详情页面,点编辑,将进入修改应用信息页面: 

进入修改应用信息页面,这里要输入应用的包名及签名的MD5,如下图:

对于Delphi开发者来说,取得签名的MD5,可以直接在项目的签名管理界面得到,当然你也可以用签名工具在命令行得到。

如下图,是Delphi项目的应用设置窗口,点击标识的按钮 Alias Info,在弹出窗口中就可以看到签名信息,其中就有MD5.

拿到应用签名的MD5, 填好MD5,点“保存修改“,返回到应用详情,然后点下图中标识的按钮,就下载到了这个aip-ocr.license

如果以前你没用过百度的开发接口,这块确实是个麻烦事。当然了,这是我编辑一个已经存在的应用。如果是新建一个应用的话,可以直接填写包名及MD5的。如下图:

准备工作做好了,接下来,我们回到Delphi,看看如何使用ChinaCock的BaiduOCR控件。

1.建立一个新的测试项目,然后拖一个CCBaiduOCR控件上来

2.获取Token,直接上代码,这里AK与SK是你在百度平台建立一个应用时得到的值:

procedure TMainForm.InitBaiduOCR;
begin
{$IFDEF ANDROID}
      // 这是2.0以前版本的方式.获取AccessToken
      //Self.CCBaiduOCR1.initAccessTokenWithAkSk('你的AK', '你的SK');

       // 2.0.0版本:授权文件(安全模式)获取AccessToken
       self.CCBaiduOCR1.initAccessTokenLicenseFile;
{$ENDIF}
end;

3.处理CCBaiduOCR1事件nitAccessTokenWithAkSkResult

当第二步取得Token后,会触发这个事件,直接代码了,对于2.0版本的SDK,要调用IDcardQualityProcessInit,这很重要,可以理解为初始化扫描身份证的模型,保证这个方法只调用一次是官方的建议。:

procedure TMainForm.CCBaiduOCR1InitAccessTokenWithAkSkResult(Sender: TObject; AErrorCode: Integer; AErrorMsg, AToken: string);
begin
  if AErrorCode = 0 then
  begin
    FBaiduOCRToken := AToken;

    //2022.04.21版本  token获取成功后 调用
    self.CCBaiduOCR1.IDcardQualityProcessInit;

    // showmessage('获取token成功!' + #13#10 + AToken);
  end
  else
  begin
    FBaiduOCRToken := '';
    // showmessage('获取token失败!' + #13#10 + AErrorMsg);
  end;
end;

3.启动扫描:

 CCBaiduOCR1.TagString := 'OCR_id_card_front_native';//扫身份证正面
 CCBaiduOCR1.OCR_id_card_front_native;//开始扫描身份证正面

 当扫描成功后,会触发CCBaiduOCR1的事件OnRecognizeResult,在这里事件,我们处理扫描的结果,下面是这个事件的原型:

procedure TMainForm.CCBaiduOCR1RecognizeResult(Sender: TObject; AOCRType: TCCBaiduOCRType;
  AErrorCode: Integer; AErrorMsg, AFilePath, AJosonResult: string;
  AIDCardInfo: TCCIDCardInfo; ABankCardInfo: TCCBankCardInfo);
begin
  ShowMessage(AFilePath);
end;

4.最后,当BaiduOCR控件所在的窗口销毁时,我们要调用IDcardQualityProcessReleaseModel方法,来释放模型,保证IDcardQualityProcessInit与这个方法配对使用是必须的。

procedure TMainForm.FormDestroy(Sender: TObject);
begin
  //2022.04.221 2.0.0版本 窗口destory的时候 释放模型
  self.CCBaiduOCR1.IDcardQualityProcessReleaseModel;
end;

关于代码部分就介绍完了。接下来,我们要修改AndroidManifest.template.xml,这部分简单,抄就行了。

处理AndroidManifest.template.xml文件:

1.增加权限:

 
   <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"/>
   <uses-feature android:name="android.hardware.camera2.full"/>
   <uses-feature android:name="android.hardware.camera"/>
   <uses-feature android:name="android.hardware.camera.autofocus" />
   

2.增加Activity:

        
        <activity
            android:name="com.chinacock.ccfmx.baidu.ocr.ui.camera.CameraActivity"
            android:configChanges="screenSize|orientation"
            android:theme="@android:style/Theme.NoTitleBar.Fullscreen"/>
        

再接下来,我们要发布百度Android SDK相关的文件:

1.在项目中加入jar文件,这里有两个文件要加入:

在项目如何加入jar文件,这里我以为你加过了,如果没加过,可以看我以前的文章。

2.发布资源文件及so文件,这里,我强烈建议你使用DeployMan来发布,利用这个工具,直接选择ChinaCock带的发布目录Android,再选择包含子目录就OK了,不要使用Delphi的发布功能,一个文件一个文件发布,这样会让人生不如死。

关于DeployMan的使用方法,我也有写过,可以去看看:

这里还有一点注意,利用发布工具会把上图中选择的目录中的所有文件发布出去,这会包括64位的SO,需要手工删除掉,不然会造成闪退,切记!

最后,我们还要发布最开始下载到的aip-ocr.license:

这里有两点要注意:
1.文件名不能变,必须用aip-ocr.license

2.发布目录要对:asset\baidu_ocr

不然的话,在获取token会产生错误,不能正确取得token,那就无法再继续执行其他的动作了。

 最后,贴张我实作的界面: