You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 14 BLE服务发现异常:服务数量始终为0的原因排查

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 10:54:53