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

Android11后台/锁屏时BLE扫描onScanResult不回调 Android10运行正常

问题原因

Android 11(API 30)存在未被你注意到的BLE扫描行为变更,触发该问题的核心原因有两个:

  1. 权限缺失:从Android 10开始位置权限拆分为前台/后台两类,Android 11进一步收紧规则:后台运行的BLE扫描依赖ACCESS_BACKGROUND_LOCATION权限,仅授予「仅在使用中允许」位置权限的应用,后台扫描到的BLE结果会被系统直接拦截,不会触发onScanResult回调。
  2. 扫描过滤器匹配规则不满足后台要求:你当前的厂商数据过滤器仅传入了厂商ID,匹配数据为空数组,属于宽松匹配规则,Android 11的后台扫描机制会直接过滤掉宽松匹配的扫描结果,避免滥用后台扫描耗电。
解决方案

按顺序排查调整即可解决:

  • 补全权限配置
    首先在AndroidManifest.xml中添加后台位置权限声明:
    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
    <!-- 若后续使用前台服务保活,还需添加对应权限 -->
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    
    运行时权限申请流程新增后台位置权限申请,引导用户将位置权限授权等级改为「始终允许」,而非默认的「仅在使用中允许」。
  • 调整扫描过滤器规则
    补全厂商数据的具体匹配内容与掩码,让扫描规则符合后台严格匹配要求,示例代码如下:
    // 替换为你实际需要匹配的厂商数据内容与对应掩码
    byte[] targetManufacturerData = new byte[]{0x00, 0x01};
    byte[] dataMask = new byte[]{(byte) 0xFF, (byte) 0xFF};
    ScanFilter filter = new ScanFilter.Builder()
            .setManufacturerData(Constants.HARDWARE_MANUFACTURER_ID, targetManufacturerData, dataMask)
            .build();
    
  • 可选:前台服务保活
    如果你确实需要无过滤的后台扫描,可以启动一个带通知的前台服务,将应用进程优先级提升至前台级,此时系统不会触发后台扫描限制规则,无需调整过滤器也可收到回调。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 09:36:02