Android 12 BLE总是在断开连接时返回状态0



在使用Android 12设备进行测试时,每当我的蓝牙设备断开连接时,无论我是通过编程断开连接还是设备超出范围,我都会收到状态0。据我所知,在以前的Android版本中,状态0是程序断开的,状态8是设备超出范围的。

return object : BluetoothGattCallback() {
override fun onConnectionStateChange(gatt: BluetoothGatt, status: Int, newState: Int) {
val name = gatt.device.name
Log.i("onConnectionStateChange", name + "t" + status + "t" + newState)
when (newState) {
BluetoothGatt.STATE_CONNECTED -> {
gatt.discoverServices()
}
BluetoothGatt.STATE_CONNECTING -> {
}
BluetoothGatt.STATE_DISCONNECTED -> {
}
BluetoothGatt.STATE_DISCONNECTING ->  {
// status 0 (Programmatically disconnected)
if (status == BluetoothGatt.GATT_SUCCESS) {
// Always going in here
...
}
// Deivce went out of range
else if(status == 8){
// Never in here
...
}
}
}

}
override fun onServicesDiscovered(gatt: BluetoothGatt?, status: Int) {
super.onServicesDiscovered(gatt, status)
}
}

是否有人遇到过同样的问题,并找到了如何正确显示状态,或者找到了另一种方法来确定它是设备超出范围还是通过编程断开连接

不幸的是,在Android 12更新后,我在Pixel 3上也有同样的行为,这有点令人难过。他们有意或无意地改变了这一点。在任何情况下,除了GATT_SUCCESS(0(应该被使用之外,状态码应该包含的内容没有被记录在任何地方;操作成功";,没有定义什么是";成功";方法我认为你应该向AOSP提交一份错误报告。

我确认你对Android 12的说法:在BLE断开连接时,无论断开连接是通过编程方式完成的,还是因为设备超出范围或电气关闭,onConnectionStateChange()中传递的状态参数的值都是0(即BluetoothGatt.GATT_SUCCESS(。

与之前版本的android相比,这是一个缺点,之前版本的android在设备超出范围(或电气关闭(时会通过状态8(0x08 = GATT CONN TIMEOUT),在通过编程成功关闭连接时会通过0。

这是Android 12、12L和13 DP上的一个常见问题/更改:(我已经就此向AOSP提交了一份错误报告,但谷歌并没有任何反馈。https://issuetracker.google.com/issues/207323675

如果你查看HCI日志,你仍然可以看到断开连接的原因,但正如你所发现的,它不再传递给应用程序。除了直接连接超时时的状态=133。

那么,也许谷歌已经开始清理将内部状态代码(如133(与BLE断开连接原因混合在一起的混乱局面了?那么问题当然是:从哪里可以得到断开连接的原因呢?

最新更新