今天,拿到作者集成最新的百度OCR的控件,因为以前的版本一直存在这个问题:BaiduOCR本地模型加载失败,所以迫不及待的想用到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.增加权限:
<!-- 百度OCR begin --> <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" /> <!-- 百度OCR end -->
2.增加Activity:
<!-- 百度ocr begin --> <activity android:name="com.chinacock.ccfmx.baidu.ocr.ui.camera.CameraActivity" android:configChanges="screenSize|orientation" android:theme="@android:style/Theme.NoTitleBar.Fullscreen"/> <!-- 百度ocr end -->
再接下来,我们要发布百度Android SDK相关的文件:
1.在项目中加入jar文件,这里有两个文件要加入:
在项目如何加入jar文件,这里我以为你加过了,如果没加过,可以看我以前的文章。
2.发布资源文件及so文件,这里,我强烈建议你使用DeployMan来发布,利用这个工具,直接选择ChinaCock带的发布目录Android,再选择包含子目录就OK了,不要使用Delphi的发布功能,一个文件一个文件发布,这样会让人生不如死。
关于DeployMan的使用方法,我也有写过,可以去看看:
DeployMan,发布文件的利器
这里还有一点注意,利用发布工具会把上图中选择的目录中的所有文件发布出去,这会包括64位的SO,需要手工删除掉,不然会造成闪退,切记!
最后,我们还要发布最开始下载到的aip-ocr.license:
这里有两点要注意:
1.文件名不能变,必须用aip-ocr.license
2.发布目录要对:asset\baidu_ocr
不然的话,在获取token会产生错误,不能正确取得token,那就无法再继续执行其他的动作了。
最后,贴张我实作的界面: