同型号手机APP蓝牙扫描异常:部分设备无法发现蓝牙设备
蓝牙扫描异常排查:新部署设备无法在APP中发现蓝牙设备
问题背景
- 同型号智能手机,5台旧设备长期用于应用测试开发,闲置新设备部署同款APP后,无法在APP内搜索到目标蓝牙设备;旧设备可正常工作
- 两类设备OS版本、应用权限、网络配置完全一致,且通过系统自带蓝牙菜单均能搜索到目标设备
- 旧设备恢复出厂设置并重装APP后,蓝牙扫描功能仍正常;新设备日志显示扫描到蓝牙数据,但未将目标设备加入APP的设备列表
日志对比
新设备异常日志
2024-05-02 14:00:38.037 22371-22398 BtGatt.GattService com.android.bluetooth V Skipping data matching denylist: ScanRecord [mAdvertiseFlags=-1, mServiceUuids=null, mServiceSolicitationUuids=[], mManufacturerSpecificData={76=[2, 21, 80, 118, 92, -73, -39, -22, 78, 33, -103, -92, -6, -121, -106, 19, -92, -110, 106, 94, 35, 4, -50]}, mServiceData={}, mTxPowerLevel=-2147483648, mDeviceName=null] 2024-05-02 14:00:38.037 22371-22398 BtGatt.GattService com.android.bluetooth I Skipping client for location deny list
旧设备正常日志
2024-05-02 13:29:54.868 18185-18185 ScanDeviceCtrl com.example.app2 I onScanResult: ScanRecord [mAdvertiseFlags=6, mServiceUuids=[d1560100-32d8-ee21-19a8-7439819a87a6], mServiceSolicitationUuids=[], mManufacturerSpecificData={1565=[33, -68, -127, -115, -31, -10, 26, -35, 0]}, mServiceData={}, mTxPowerLevel=-2147483648, mDeviceName=A8D81] 2024-05-02 13:29:54.868 18185-18185 ScanDeviceCtrl com.example.app2 I DeviceName: A8D81 2024-05-02 13:29:54.868 18185-18185 ScanDeviceCtrl com.example.app2 I ServiceData: {} 2024-05-02 13:29:54.868 18185-18185 ScanDeviceCtrl com.example.app2 I Battery Level: 2880 mV
核心分析
新设备日志中的**Skipping data matching denylist和Skipping client for location deny list是关键线索:蓝牙扫描结果被系统层面的拒绝列表(denylist)**拦截,且拦截规则与位置权限关联。
排查与解决方案
- 检查系统蓝牙扫描过滤设置:部分厂商定制系统(如小米、华为)自带蓝牙扫描过滤/隐私保护功能,默认拦截未匹配规则的设备。进入「设置-蓝牙-高级设置」,关闭扫描过滤规则,或添加目标设备的Service UUID(
d1560100-32d8-ee21-19a8-7439819a87a6)、厂商ID到白名单。 - 确认位置权限的实际生效状态:即使权限显示已开启,部分设备对新安装APP的位置权限有额外限制。进入「设置-应用-目标APP-权限-位置信息」,确保开启**「始终允许」**权限,而非仅「使用中允许」。
- 验证APP扫描逻辑:对比日志可知,旧设备扫描到的目标设备带有特定Service UUID,而新设备日志中显示的是厂商ID为76(苹果设备)的无关设备。需确认APP扫描代码是否正确设置了目标Service UUID的过滤规则,示例代码如下:
同时确认目标蓝牙设备在新设备的信号覆盖范围内,排除信号干扰问题。BluetoothLeScanner scanner = BluetoothAdapter.getDefaultAdapter().getBluetoothLeScanner(); List<ScanFilter> filters = new ArrayList<>(); ParcelUuid targetUuid = ParcelUuid.fromString("d1560100-32d8-ee21-19a8-7439819a87a6"); ScanFilter filter = new ScanFilter.Builder().setServiceUuid(targetUuid).build(); filters.add(filter); ScanSettings settings = new ScanSettings.Builder().build(); scanner.startScan(filters, settings, scanCallback); - 重置蓝牙系统配置:进入「设置-系统-重置-重置蓝牙设置」,清除所有蓝牙配对记录与配置,重启蓝牙后重新测试APP扫描功能。
- 检查系统补丁差异:同型号设备可能存在不同的系统补丁版本,即使OS版本一致,蓝牙相关补丁也可能有区别。进入「设置-关于手机-系统更新」,安装新设备的所有可用系统补丁后再测试。
内容的提问来源于stack exchange,提问作者koralræv
相关产品推荐
相关产品推荐

