You need to enable JavaScript to run this app. Delphi广播接收器在启用谷歌服务的安卓设备上无法接收扫码枪数据
优惠活动
大模型
产品
解决方案
定价
更多

Delphi广播接收器在启用谷歌服务的安卓设备上无法接收扫码枪数据

问题根因

你遇到的设备差异,本质是搭载GMS谷歌服务的安卓系统对自定义隐式广播的严格管控,和无GMS工业定制系统的宽松权限策略直接相关,具体触发点有三个:

  1. 安卓8.0(API 26)开始,谷歌强制推行广播限制:绝大多数隐式自定义广播,不允许通过Manifest静态注册的方式接收,必须由应用在运行时通过代码动态注册;无GMS的国内工业设备定制系统大多没有严格执行这条限制,所以你之前的代码在这类设备上能正常跑通。
  2. 带GMS的系统会严格校验自定义广播的发送方、接收方的权限匹配关系,无GMS设备往往会跳过这类权限校验。
  3. 你目前的代码逻辑存在错位:在Manifest里配置的扫码静态广播,在带GMS的高版本设备上本身就会被系统拦截失效;而代码里动态注册的Receiver,没有匹配扫码枪硬件发送广播时要求的权限参数,等于广播根本没投递到你的应用。

针对性解决步骤

  • 直接删掉AndroidManifest.template.xml里配置的扫码静态intent-filter
    你添加的<action android:name="android.intent.ACTION_DECODE_DATA" />对应的静态注册配置,在API26以上带GMS的设备上完全无效,甚至可能因为权限不匹配触发系统的广播拦截规则,没有保留的必要。
  • 动态注册Receiver时补全权限匹配参数
    绝大多数集成式扫码枪(优博讯、霍尼韦尔、销邦等工业手持设备)发送解码广播时,会要求接收方持有对应硬件的专属权限,你需要修改原有的注册逻辑:
    procedure TForm1.FormCreate(Sender: TObject);
    const
      // 替换为你对应硬件厂商扫码枪的广播权限字符串,可查设备的SDK文档获取
      SCAN_BROADCAST_PERMISSION = 'com.zebra.decode.permission.RECEIVE_DATA';
    var
      Filter: JIntentFilter;
    begin
      FMyListener := TMyReceiver.Create;
      FBroadcastReceiver := TJFMXBroadcastReceiver.JavaClass.init(FMyListener);
      Filter := TJIntentFilter.JavaClass.init;
      // 原有3个系统广播的监听逻辑完全保留
      Filter.addAction(TJIntent.JavaClass.ACTION_SCREEN_OFF);
      Filter.addAction(TJIntent.JavaClass.ACTION_SCREEN_ON);
      Filter.addAction(TJIntent.JavaClass.ACTION_AIRPLANE_MODE_CHANGED);
      // 保留扫码广播的Action匹配
      Filter.addAction(StringToJString('android.intent.ACTION_DECODE_DATA'));
      // 核心修改:注册时带上权限校验参数,匹配带GMS系统的广播投递规则
      TAndroidHelper.Context.getApplicationContext.registerReceiver(
        FBroadcastReceiver,
        Filter,
        StringToJString(SCAN_BROADCAST_PERMISSION),
        nil
      );
    end;
    
  • 在Manifest中声明对应的硬件扫码权限
    找到AndroidManifest.template.xml里的根<manifest>节点,在其中添加对应的uses-permission配置,替换为对应设备的扫码权限值:
    <uses-permission android:name="com.zebra.decode.permission.RECEIVE_DATA" />
    
  • 排查广播标记的拦截规则
    很多带GMS的设备上,扫码枪发送的解码广播会携带FLAG_RECEIVER_REGISTERED_ONLY标记,这个标记的作用是:只有应用运行过程中动态注册的Receiver才能接收,Manifest静态注册的Receiver会被系统直接拦截——这也是为什么你之前在带GMS设备上配了静态规则依然收不到广播的核心原因。

补充排查技巧:如果修改后依然收不到扫码数据,可以在动态注册的Receiver回调里,加日志打印所有收到的Intent的Action字符串,部分带GMS的定制系统会给第三方硬件的自定义广播Action加上系统包名前缀,导致你固定写死的Action字符串匹配不上。

内容的提问来源于stack exchange,提问作者mesutuk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.27 01:45:01