Delphi安卓应用无法接收Sunmi与Unitech扫描设备的Intent广播
Delphi安卓应用无法接收Sunmi/Unitech扫描广播问题
问题概述
基于Delphi Alexandria(Delphi 11.1)开发的安卓移动应用,可正常接收Zebra条码扫描设备的广播,但无法接收已配置为广播输出条码的Sunmi和Unitech设备的广播。Manifest文件已配置对应Intent过滤器,代码中也注册了相关Intent并编写了广播处理逻辑,但Sunmi和Unitech的广播始终无法触发应用的处理函数。
Manifest配置
<!-- Zebra - OK --> <intent-filter> <action android:name="fr.XXX.YYY.ACTION" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> <intent-filter> <!-- SUNMI - Ko --> <action android:name="com.sunmi.scanner.ACTION_DATA_CODE_RECEIVED" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> <intent-filter> <!-- Unitech - Ko --> <action android:name="unitech.scanservice.data" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter>
Intent注册代码
MainActivity.registerIntentAction(StringToJString(bcZebra)); MainActivity.registerIntentAction(StringToJString(bcSunmi)); MainActivity.registerIntentAction(StringToJString(bcUnitech));
广播处理逻辑
function TfData.HandleIntentAction(const Data: JIntent): Boolean; var bc : string; begin TOSLog.d('********* SCAN ******************'); TOSLog.d(JStringToString(Data.getAction)); Result := False; if Data <> nil then begin // Zebra, bcZebraData = com.symbol.datawedge.data_string - Ok if StringToJString(bcZebra).equals(Data.getAction) then begin bc := JStringToString(Data.getStringExtra(StringToJString(bcZebraData))); result := true; bcScan(bc); end // Sunmi, bcSunmiData = 'data' - Ko else if StringToJString(bcSunmi).equals(Data.getAction) then begin bc := JStringToString(Data.getStringExtra(StringToJString(bcSunmiData))); result := true; bcScan(bc); end // Unitech, bcUnitechData = 'text' - Ko else if StringToJString(bcUnitech).equals(Data.getAction) then begin bc := JStringToString(Data.getStringExtra(StringToJString(bcUnitechData))); result := true; bcScan(bc); end; end; end;
测试情况
- Zebra扫描:应用日志正常输出扫描标识及Action,处理函数正常执行。
- Sunmi/Unitech扫描:系统日志显示已发送对应广播,但应用的
HandleIntentAction函数未被调用。
排查方向
- 广播类型验证:Android 8.0+对隐式广播有严格限制,确认Sunmi/Unitech发送的是显式还是隐式广播。如果是隐式广播,Manifest注册的过滤器可能失效,需确认Delphi的
registerIntentAction是否为动态注册接收器,且正确处理了广播的category和权限。 - Action字符串一致性检查:确保代码中
bcSunmi、bcUnitech常量的字符串值与Manifest配置完全一致,包括大小写、拼写(比如Sunmi的Action为com.sunmi.scanner.ACTION_DATA_CODE_RECEIVED,Unitech为unitech.scanservice.data)。 - 设备扫描配置确认:重新检查Sunmi和Unitech设备的扫描输出设置,确保确实发送指定Action的广播,而非模拟键盘输入或其他输出模式。
- 权限补充:部分设备的扫描广播需要特定权限,在Manifest中添加对应权限声明:
<uses-permission android:name="com.sunmi.permission.SCANNER"/> <!-- Unitech权限可参考其官方文档添加 --> - 框架兼容性测试:尝试手动创建Android原生BroadcastReceiver并动态注册,替代Delphi的
registerIntentAction方法,验证是否能接收到广播,排除框架层面的问题。 - 系统拦截排查:暂时关闭设备上的安全管家、拦截类软件,确认是否存在广播被拦截的情况。
内容的提问来源于stack exchange,提问作者user2244705
相关产品推荐
相关产品推荐

