Delphi FireMonkey安卓应用在Zebra TC52上实现OCR扫描问题咨询
Zebra TC52 OCR扫描功能对接方案
Zebra TC52的OCR扫描能力不提供独立的隐式Intent调用接口,所有硬件扫描相关能力统一由设备预装的DataWedge服务托管,不需要集成EMDK SDK,通过广播Intent即可完成对接,适配Embarcadero RAD Studio 11的安卓开发环境没有兼容问题,具体实现步骤如下:
前置配置(设备端操作)
- 打开TC52预装的DataWedge应用,新建独立配置Profile,绑定你开发的应用的正式包名,避免和设备上其他应用的扫描配置冲突
- 进入Profile的
Scanner Input设置项,将默认的条码扫描模式切换为OCR识别模式 - 新增OCR识别规则:限定允许识别的字符集仅为0-9数字,固定识别长度为10位,可根据实际文档上的编号位置配置识别区域裁剪,缩小识别范围能大幅降低误识别率、提升识别速度
- 进入Profile的
Intent Output设置项,开启Intent输出,自定义一个唯一的广播Action(比如com.yourdomain.yourapp.OCR_RESULT),投递方式选择Broadcast Intent,开启「仅投递给前台活动」选项,避免结果被其他后台应用截获
RAD Studio 11 端代码实现
- 工程不需要申请特殊运行时权限,仅需在窗体创建时注册对应Action的广播接收器,用于接收扫描结果
- 界面按钮的点击事件中,直接向DataWedge发送广播触发扫描即可,不需要自行实现相机预览、OCR识别逻辑,核心触发代码如下:
uses Androidapi.JNI.GraphicsContentViewText, Androidapi.Helpers; procedure TMainForm.BtnStartScanClick(Sender: TObject); var TriggerIntent: JIntent; begin TriggerIntent := TJIntent.JavaClass.init(StringToJString('com.symbol.datawedge.api.ACTION')); TriggerIntent.putExtra( StringToJString('com.symbol.datawedge.api.SOFT_SCAN_TRIGGER'), StringToJString('START_SCANNING') ); TAndroidHelper.Context.sendBroadcast(TriggerIntent); end;
- 在广播接收器的回调中,从Intent的Extra字段提取识别结果,做格式校验后即可直接使用,核心结果处理代码如下:
uses System.RegularExpressions; const DW_DATA_TAG = 'com.symbol.datawedge.data_string'; var OCRResult: string; begin if FScanReceiver.getReceivedIntent.hasExtra(StringToJString(DW_DATA_TAG)) then begin OCRResult := JStringToString( FScanReceiver.getReceivedIntent.getStringExtra(StringToJString(DW_DATA_TAG)) ); // 校验结果为10位纯数字即符合业务要求 if TRegEx.IsMatch(OCRResult, '^\d{10}$') then edtNo.Text := OCRResult; end; end;
注意事项
- 不要尝试自行调用系统相机实现OCR:TC52的OCR能力是基于内置硬件扫描引擎实现的,走DataWedge调用的识别速度、暗光环境识别率远高于通用相机OCR方案
- 如果触发扫描无响应,优先检查DataWedge Profile绑定的包名是否和RAD Studio编译配置中的应用包名完全一致,包名大小写敏感,不一致时DataWedge不会响应应用的扫描请求
- OCR识别规则必须配置字符集和长度限制,否则会识别到文档上其他无关数字,误识别率会非常高
- 不要集成Zebra官方的EMDK for Android,该SDK对Delphi/C++Builder的跨平台编译适配存在大量兼容问题,纯Intent对接方案不需要引入任何第三方依赖,打包后APK无额外体积增量
内容的提问来源于stack exchange,提问作者user2623554
相关产品推荐
相关产品推荐

