Android BLE подключается в фоновом режиме после отключения

Мы используем RxAndroidBle 1.3.1 для подключения к устройствам BLE с Android. На некоторых телефонах (в настоящее время я вижу это на LG V20 [LG-H918], Android 7.0) после отключения нашего приложения телефон будет продолжать подключаться без каких-либо действий пользователя.

Когда мы закрываем наше приложение, устройство отключается. Тогда мы можем убить процесс нашего приложения. Примерно через двадцать секунд телефон повторно подключается к устройству примерно на 2 секунды, а затем отключается. Такое поведение повторяется каждые 10-20 секунд бесконечно, пока мы не перезагрузим телефон.

Фактически, мы даже получаем повторяющиеся соединения, если мы жестко убиваем приложение, пока соединение все еще существует.

Это логи, когда мы отключаемся:

06-21 10:51:07.464 26640-26640/com.hatchbaby.rest.qa I/Nightlight: [main] Disconnecting: Nightlight.disconnect()
06-21 10:51:07.528 26640-26640/com.hatchbaby.rest.qa D/BluetoothGatt: setCharacteristicNotification() - uuid: 02240003-5efd-47eb-9c1a-de53f7a2b232 enable: false
06-21 10:51:07.538 26640-26640/com.hatchbaby.rest.qa D/RxBle#Radio:   QUEUED RxBleRadioOperationDescriptorWrite(131621266)
06-21 10:51:07.539 26640-26690/com.hatchbaby.rest.qa D/RxBle#Radio:  STARTED RxBleRadioOperationDescriptorWrite(131621266)
06-21 10:51:07.543 26640-26640/com.hatchbaby.rest.qa D/BluetoothGatt: setCharacteristicNotification() - uuid: 02260002-5efd-47eb-9c1a-de53f7a2b232 enable: false
06-21 10:51:07.547 26640-26640/com.hatchbaby.rest.qa D/RxBle#Radio:   QUEUED RxBleRadioOperationDescriptorWrite(250764313)
06-21 10:51:07.548 26640-26640/com.hatchbaby.rest.qa D/RxBle#Radio:   QUEUED RxBleRadioOperationDisconnect(160892126)
06-21 10:51:07.562 26640-26640/com.hatchbaby.rest.qa I/Nightlight: [main] Nightlight state: RxBleConnectionState{DISCONNECTED}
06-21 10:51:07.686 26640-26747/com.hatchbaby.rest.qa D/RxBle#BluetoothGatt: onDescriptorWrite descriptor=00002902-0000-1000-8000-00805f9b34fb status=0
06-21 10:51:07.688 26640-26690/com.hatchbaby.rest.qa D/RxBle#Radio: FINISHED RxBleRadioOperationDescriptorWrite(131621266)
06-21 10:51:07.689 26640-26690/com.hatchbaby.rest.qa D/RxBle#Radio:  STARTED RxBleRadioOperationDescriptorWrite(250764313)
06-21 10:51:07.783 26640-26746/com.hatchbaby.rest.qa D/RxBle#BluetoothGatt: onDescriptorWrite descriptor=00002902-0000-1000-8000-00805f9b34fb status=0
06-21 10:51:07.786 26640-26690/com.hatchbaby.rest.qa D/RxBle#Radio: FINISHED RxBleRadioOperationDescriptorWrite(250764313)
06-21 10:51:07.787 26640-26690/com.hatchbaby.rest.qa D/RxBle#Radio:  STARTED RxBleRadioOperationDisconnect(160892126)
06-21 10:51:07.787 26640-26640/com.hatchbaby.rest.qa D/BluetoothManager: getConnectionState()
06-21 10:51:07.787 26640-26640/com.hatchbaby.rest.qa D/BluetoothManager: getConnectedDevices
06-21 10:51:07.793 26640-26640/com.hatchbaby.rest.qa D/BluetoothGatt: cancelOpen() - device: E5:D6:FC:68:FB:55
06-21 10:51:07.797 26640-26653/com.hatchbaby.rest.qa D/BluetoothGatt: onClientConnectionState() - status=0 clientIf=6 device=E5:D6:FC:68:FB:55
06-21 10:51:07.797 26640-26653/com.hatchbaby.rest.qa D/RxBle#BluetoothGatt: onConnectionStateChange newState=0 status=0
06-21 10:51:07.803 26640-26640/com.hatchbaby.rest.qa D/BluetoothGatt: close()
06-21 10:51:07.803 26640-26640/com.hatchbaby.rest.qa D/BluetoothGatt: unregisterApp() - mClientIf=6
06-21 10:51:07.807 26640-26690/com.hatchbaby.rest.qa D/RxBle#Radio: FINISHED RxBleRadioOperationDisconnect(160892126)

Я сбит с толку; любая помощь приветствуется!


person Ken DeLong    schedule 19.06.2017    source источник
comment
Не могли бы вы показать свой код и логи из приложения?   -  person Dariusz Seweryn    schedule 20.06.2017
comment
Мне кажется, что это ошибка в Android.   -  person Emil    schedule 20.06.2017
comment
Сообщение отредактировано с логами. Код слишком длинный и запутанный, но при отключении мы отменяем подписку на Observable<RxBleConnection>.   -  person Ken DeLong    schedule 21.06.2017
comment
Виновник - Spotify Connect.   -  person Ken DeLong    schedule 28.07.2017


Ответы (3)


Убедитесь, что вы вызвали close метод.

метод закрытия

person Tony Lin    schedule 20.06.2017
comment
Я использую библиотеку RxAndroidBle; вы на самом деле не вызываете close(), вы отказываетесь от подписки на все Observables, которые имеют отношение к этому соединению. Фактически, я вижу операцию отключения радио в журналах, поэтому кажется, что он отключается правильно. - person Ken DeLong; 21.06.2017

Убедитесь, что при подключении профиля Gatt из своего приложения для флага автоматического подключения установлено значение false Из Android документация для BLE: -

Подключение к серверу GATT Первым шагом во взаимодействии с устройством BLE является подключение к нему, а точнее подключение к серверу GATT на устройстве. Чтобы подключиться к серверу GATT на устройстве BLE, вы используете метод connectGatt (). Этот метод принимает три параметра: объект Context, autoConnect (логическое значение, указывающее, следует ли автоматически подключаться к устройству BLE, как только оно становится доступным), и ссылку на BluetoothGattCallback:

mBluetoothGatt = device.connectGatt(this, false, mGattCallback);

person Zakir    schedule 19.06.2017
comment
Если вы правильно вызываете Disconnect () для объекта BluetoothGatt, то не имеет значения, устанавливаете ли вы для autoConnect значение true или false. - person Emil; 20.06.2017
comment
@Emil: Я намекал на потенциальную ошибку в стеке удаленной стороны, вызванную автоматическим подключением в приложении OP, поэтому хотел исключить это - person Zakir; 20.06.2017
comment
Автоподключение ложное. Как отмечалось выше, в RxAndroidBle вы не вызываете disconnect() напрямую; вместо этого вы отказываетесь от подписки на Rx Observables, которые проявили интерес к этому соединению. - person Ken DeLong; 21.06.2017

Виновник - Spotify Connect. Он отслеживает любое отключение устройства Bluetooth и немедленно пытается подключиться к нему. Иногда заходит в бесконечный цикл, иногда цикл подключения в конце концов останавливается. Но мы смогли избавиться от этого разрушительного поведения, остановив SC, и мы смогли сделать это на других телефонах, установив его.

См. Также Android BLE неожиданно и неоднократно повторно подключается к периферийному устройству

person Ken DeLong    schedule 28.07.2017