Android 14 BLE服务发现异常:服务数量始终为0的原因排查
我在项目中使用一个.jar库处理BLE设备的扫描与连接。在Android系统回调的onConnectionStateChange方法中,设备连接成功后会调用gatt.discoverServices()枚举服务和特征,触发onServicesDiscovered回调。该逻辑在Android 13上正常运行,能正确枚举服务与特征;但在Android 14中服务数量始终为0,添加延迟也无法解决问题。
相关代码
onConnectionStateChange 实现
@Override public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) { androidBluetoothLog("onConnectionStateChange"); String deviceAddress = gatt.getDevice().getAddress(); if (newState == BluetoothProfile.STATE_CONNECTED) { removeConnectingDevice(deviceAddress, false); // start discovering services gatt.discoverServices(); } else if (newState == BluetoothProfile.STATE_DISCONNECTED) { removeConnectingDevice(deviceAddress, false); gatt.close(); } }
onServicesDiscovered 实现
@Override // New services discovered public void onServicesDiscovered(BluetoothGatt gatt, int status) { if (status == BluetoothGatt.GATT_SUCCESS) { androidBluetoothLog("Services Discovered"); List<BluetoothGattService> services = gatt.getServices(); if (services != null) { androidBluetoothLog("Service Count: " + services.size()); String deviceAddress = gatt.getDevice().getAddress(); for (BluetoothGattService service : services) { List<BluetoothGattCharacteristic> characteristics = service.getCharacteristics(); for (BluetoothGattCharacteristic characteristic : characteristics) { androidBluetoothLog("Characteristic found"); } } } } else { androidBluetoothLog("Error~Service Discovery " + status); } }
可能的原因分析
权限校验强化:Android 14对
BLUETOOTH_CONNECT权限的运行时校验更严格,仅在Manifest中声明权限已不足以访问BLE服务。需确认应用在Android 14上是否主动申请并获取了该权限的用户授权。GATT缓存策略变更:Android 14调整了GATT服务的缓存逻辑,默认可能不再加载旧缓存或缓存失效。可尝试在
onServicesDiscovered中先调用gatt.refresh()刷新服务列表,再调用getServices()获取最新数据。后台BLE操作限制:Android 14限制了后台应用的BLE操作权限,若应用在连接设备时处于后台,服务发现请求可能被系统拦截。需确认连接触发时机是否在前台,或为应用申请后台运行相关权限。
未配对设备服务访问限制:Android 14中,部分未配对BLE设备的服务仅在配对后才能被枚举。可尝试手动配对目标设备后,再测试服务发现是否正常。
GATT调用时机约束:Android 14中
onConnectionStateChange回调STATE_CONNECTED时,实际连接可能尚未完全就绪,此时调用discoverServices()可能无法正确获取服务。可尝试等待onMtuChanged等回调确认连接稳定后,再发起服务发现请求。
内容的提问来源于stack exchange,提问作者user856232

