索尼Xperia XZ2 Compact上CompanionDeviceManager按服务UUID过滤无设备
解决CompanionDeviceManager按蓝牙服务UUID过滤无设备显示的问题
可能原因及修复方案
1. 目标设备未主动广播电池服务UUID
多数蓝牙设备默认不会主动广播所有支持的GATT服务UUID,电池服务(0000180F-0000-1000-8000-00805f9b34fb)这类服务通常仅在建立连接后才会暴露。而CompanionDeviceManager的过滤逻辑完全依赖设备主动广播的UUID,所以即便设备支持该服务,未广播的话也无法被匹配到。
你可以用蓝牙调试工具扫描目标设备,确认其广播包中是否包含该电池服务UUID。如果没有,要么修改外设的广播设置(若为自研设备),要么更换设备已主动广播的UUID进行过滤。
2. Android 10定制系统的兼容性问题
索尼Xperia XZ2 Compact搭载的Android 10定制系统,可能对CompanionDeviceManager的UUID过滤逻辑存在实现差异。可以尝试两种调整:
- 使用
addServiceUuid的重载方法,传入第二个参数(服务名称):.addServiceUuid(ParcelUuid(UUID.fromString("0000180F-0000-1000-8000-00805f9b34fb")), "Battery Service") - 先通过空过滤获取所有设备,再手动筛选:
- 用空
BluetoothDeviceFilter调用associate,获取所有可见设备 - 在
CompanionDeviceManager.Callback的onDeviceFound回调中,对每个设备发起GATT连接,查询其支持的服务列表 - 仅保留包含电池服务UUID的设备供用户选择
- 用空
3. 权限配置不完整
确保应用已声明并获取必要权限:
- Android 10需要
BLUETOOTH、BLUETOOTH_ADMIN和ACCESS_FINE_LOCATION权限(位置权限是蓝牙扫描的强制前提) - 除了在Manifest中声明权限,还需在运行时主动请求
ACCESS_FINE_LOCATION,否则扫描会返回空结果
4. 蓝牙扫描模式限制
检查测试设备的蓝牙扫描模式是否为SCAN_MODE_CONNECTABLE_DISCOVERABLE或SCAN_MODE_CONNECTABLE,部分设备在特定状态下会限制扫描范围。可以通过代码临时触发传统扫描辅助验证:
val bluetoothAdapter = BluetoothAdapter.getDefaultAdapter() bluetoothAdapter?.startDiscovery()
注:startDiscovery是传统蓝牙扫描,和CompanionDeviceManager的扫描逻辑不同,但可用于确认目标设备是否能被正常检测到。
内容的提问来源于stack exchange,提问作者neXos
相关产品推荐
相关产品推荐

