You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 20:20:53