Android 12断开蓝牙连接后总是返回状态0

3

当我使用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)
            }
}

有人遇到过同样的问题并找到了正确显示状态或以编程方式确定设备是否超出范围或断开连接的另一种方法吗?
3个回答

2
我确认您在Android 12上的说法:在BLE断开连接时,无论是程序化断开还是设备超出范围或电源关闭,传递给onConnectionStateChange()的状态参数值为0(即BluetoothGatt.GATT_SUCCESS)。
与之前版本的Android相比,这是一个缺点,因为之前版本会在设备超出范围(或电源关闭)时传递状态8 (0x08 = GATT CONN TIMEOUT),而在成功程序化关闭连接时传递状态0。

1

很遗憾,我的Pixel 3在Android 12更新后也出现了同样的问题,这有点令人沮丧。无论他们是故意还是无意地更改了这个行为,事实上状态码应该包含什么都没有被记录下来,除了GATT_SUCCESS(0)应该用于“操作成功”时,没有定义“成功”的含义。我认为您应该向AOSP提交一个错误报告。


1

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

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

那么,谷歌可能已经开始清理混合内部状态代码(如133)与BLE断开原因的混乱了吗? 问题当然是:那么在哪里可以获得断开连接的原因呢?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接