Android connectGatt с автоматическим подключением true никогда не вызывается `onConnectionStateChange` - PullRequest
0 голосов
/ 24 февраля 2020

Мой пример кода прост:

        connectButton.setOnClickListener {
            (getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager?)?.adapter?.getRemoteDevice(
                "44:73:D6:0A:EA:79"
            )?.let {
                Log.i(TAG, "trying to connect ${it.type}")
                val gatt = it.connectGatt(this, true, object : BluetoothGattCallback() {
                    override fun onConnectionStateChange(
                        gatt: BluetoothGatt?,
                        status: Int,
                        newState: Int
                    ) {
                        Log.i(TAG, "connection  status: $status, newState: $newState")
                    }
                }, TRANSPORT_AUTO)
                Log.i(TAG, "gatt is $gatt")
            }

При autoConnect = true журнал внутри onConnectionStateChange никогда не печатается.

I/BLE: trying to connect 2
D/BluetoothGatt: connect() - device: 44:73:D6:0A:EA:79, auto: true
    registerApp()
    registerApp() - UUID=6376adc0-c38c-4088-8da7-2175a640cec2
I/BLE: gatt is android.bluetooth.BluetoothGatt@415f1c6
D/BluetoothGatt: onClientRegistered() - status=0 clientIf=5

со значением false, он печатает еще три строки

I/BLE: connection  status: 0, newState: 2
D/BluetoothGatt: onConnectionUpdated() - Device=44:73:D6:0A:EA:79 interval=6 latency=0 timeout=500 status=0
D/BluetoothGatt: onConnectionUpdated() - Device=44:73:D6:0A:EA:79 interval=36 latency=0 timeout=500 status=0

Протестировано на Huawei Mate20 с установленным android 10.

Редактировать: периферийное устройство имитируется другим устройством Android / iOS, при подключении к наушнику Bose этот фрагмент выглядит хорошо, могу ли я что-нибудь сделать, чтобы симуляционное устройство работало?

1 Ответ

0 голосов
/ 24 февраля 2020

В API Android отсутствует параметр "тип адреса", что является ошибкой проектирования. Ваше периферийное устройство рекламирует со случайным разрешаемым адресом, и в этом случае плохая идея подключиться напрямую, используя адрес Bluetooth. Вместо этого вы должны сначала выполнить сканирование BLE, а затем подключиться к найденному устройству. Таким образом, Android «узнает» тип адреса из рекламных данных, а затем может подключиться, используя правильный тип адреса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...