BLE Gatt的onCharacteristicChanged方法未回调 同指令第三方扫描APP正常
问题排查与修复方案
1. 核心错误:CCCD描述符值被覆盖
你给出的注册通知代码中存在直接逻辑错误,连续两次给0x2902描述符赋值,后一次赋值会直接覆盖前一次的值:
// 错误写法 descriptor.value = BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE descriptor.value = BluetoothGattDescriptor.ENABLE_INDICATION_VALUE // 这行直接覆盖了上一行的配置
BLE特征值通常仅支持Notify或Indication中的一种,你需要根据该特征值的实际属性二选一,删除多余的赋值行即可:
// 正确写法:仅保留你需要开启的类型,比如开通知就只保留这行 descriptor.value = BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE
2. 入参合法性校验
- 确认
setCharacteristicNotification的第一个入参是BluetoothGattCharacteristic实例,而非字符串,官方API不接收字符串类型的入参,传错会导致监听注册失败 - 调用注册逻辑前先校验特征值属性:确认
NOTIFY_SERVICE_CHARACTERISTIC.properties包含PROPERTY_NOTIFY(开通知)或PROPERTY_INDICATION(开指示)属性,属性不匹配无法收到回调
3. 异步操作时序校验
- 检查
writeDescriptor返回的status是否等于BluetoothGatt.GATT_SUCCESS,仅在描述符写入成功后再发送后续指令,写入失败时要做重试逻辑 - 确认
writeCharacteristic传入的参数是你刚调用setValue的那个特征值实例,不要出现赋值和写入的特征值不匹配的问题
4. 其他常见场景排查
- 确认BLE连接状态正常,没有中途出现断连重连的情况,重连后需要重新执行通知注册逻辑
- 检查是否注册了正确的
BluetoothGattCallback实例,回调实例被覆盖或者未正确绑定到gatt连接也会收不到回调
内容的提问来源于stack exchange,提问作者DeepAmin
相关产品推荐
相关产品推荐

