Android11后台/锁屏时BLE扫描onScanResult不回调 Android10运行正常
问题原因
Android 11(API 30)存在未被你注意到的BLE扫描行为变更,触发该问题的核心原因有两个:
- 权限缺失:从Android 10开始位置权限拆分为前台/后台两类,Android 11进一步收紧规则:后台运行的BLE扫描依赖
ACCESS_BACKGROUND_LOCATION权限,仅授予「仅在使用中允许」位置权限的应用,后台扫描到的BLE结果会被系统直接拦截,不会触发onScanResult回调。 - 扫描过滤器匹配规则不满足后台要求:你当前的厂商数据过滤器仅传入了厂商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
相关产品推荐
相关产品推荐

