Android 13 BLE服务搜索失败问题解决方案咨询
核对扫描过滤的准确性:Android 13收紧了BLE扫描的过滤规则,别用模糊的过滤条件。比如如果只传了服务UUID的片段,系统可能直接过滤掉匹配结果。扫描时务必传入完整的目标服务UUID数组,示例代码:
BluetoothLeScanner.startScan(Arrays.asList(new ScanFilter.Builder().setServiceUuid(ParcelUuid.fromString("你的目标服务UUID")).build()), scanSettings, scanCallback);检查后台扫描限制:Android 13对后台BLE扫描的限制比之前严格很多,App在后台时扫描频率会被压得很低,甚至直接停止。先把App切到前台测试,看能不能搜到服务;如果必须后台扫描,得申请
ACCESS_BACKGROUND_LOCATION权限(注意别滥用,只在真正需要时申请)。排查设备蓝牙固件问题:有些Android 13设备的蓝牙固件适配有bug,先试试重启蓝牙,或者把系统更到最新版本。还可以开开发者选项里的「蓝牙HCI snoop log」抓扫描日志,和Android 11设备的日志对比,看看扫描请求是不是没发出去,或者响应被拦截了。
调整扫描模式参数:Android 13对扫描模式的优先级做了调整,试试用
ScanSettings.SCAN_MODE_LOW_LATENCY模式,虽然费电,但能保证扫描的及时性。别用SCAN_MODE_OPPORTUNISTIC,这个模式在Android 13下基本扫不到东西。确认BLE服务器的广播数据:确保你的BLE服务器设备广播包里正确带了服务UUID,Android 13对广播数据的解析更严,如果UUID格式不对(比如长度错了),系统直接忽略。用nRF Connect这类工具看看广播包内容,确认服务UUID确实在广播数据里。
再确认权限的实际状态:哪怕你觉得权限配置好了,Android 13的
BLUETOOTH_SCAN是危险权限,必须动态申请。用Context.checkSelfPermission(Manifest.permission.BLUETOOTH_SCAN)检查权限是不是真的被授予了。另外,Android 12+里BLE扫描不需要ACCESS_FINE_LOCATION,除非你的扫描逻辑必须关联位置,否则别瞎申请。
内容的提问来源于stack exchange,提问作者Jose Bravo

