Android BLE BluetoothGatt objeto permanece conectado y desencadena onCharacteristicChanged () incluso después de una llamada a desconectar ()
Estoy tratando de desconectar las notificaciones de características cuando estoy saliendo de mi aplicación. Aquí está cómo lo hago en mi función de exitCleanup ():
if (btGatt != null && mWriteChar != null) { boolean b=btGatt.setCharacteristicNotification(mWriteChar, false); Log.w("AppInfo", "Exiting and Unsubscribing: " + b); }
El registro muestra: Exiting and Unsubscribing: true
. Hasta aquí todo bien. A continuación, intento desconectar el objeto GATT completamente utilizando lo siguiente:
- Android BluetoothGatt - estado 133 - registro de devolución de llamada
- ¿Tiene la naturaleza nativa de sincronización BLE GATT de implementación de Android?
- Bluetooth Bluetooth de bajo consumo de energía
- StartLeScan con 128 UUIDs de bits no funciona en la implementación BLE de Android nativa
- Android - No se pudo conectar al dispositivo bluetooth en Lollipop
if (btGatt != null && btManager!=null && btManager.getConnectionState(btDevice, BluetoothProfile.GATT) != BluetoothProfile.STATE_DISCONNECTED ) { //Making sure that gatt and bt manager are still with us //Also making sure that the connection state is NOT disconnected btGatt.disconnect(); btGatt.close(); Log.w( "AppInfo", "FINISHING. Connection state=" + btManager.getConnectionState(btDevice, BluetoothProfile.GATT) ); }
Aquí es donde las cosas se ponen raras. El registro ahora muestra lo siguiente: FINISHING. Connection state=2
FINISHING. Connection state=2
, lo que indica que el Dispositivo Bluetooth sigue conectado.
Esto es un problema, porque cuando la aplicación termina y destruye todos los activos, el BluetoothGattCallback sigue recibiendo notificaciones tras bambalinas. Primero lanza la siguiente NullPointerException:
04-25 22:49:54.392 17280-17293/com.myapp.appinfo D/BluetoothGatt﹕ onClientConnectionState() - status=0 clientIf=8 device=54:4A:16:26:A1:B5 04-25 22:49:54.392 17280-17293/com.myapp.appinfo W/BluetoothGatt﹕ Unhandled exception in callback java.lang.NullPointerException at android.bluetooth.BluetoothGatt$1.onClientConnectionState(BluetoothGatt.java:168) at android.bluetooth.IBluetoothGattCallback$Stub.onTransact(IBluetoothGattCallback.java:71) at android.os.Binder.execTransact(Binder.java:404) at dalvik.system.NativeStart.run(Native Method) 04-25 22:49:54.402 17280-17280/com.myapp.appinfo D/BluetoothManager﹕ getConnectionState()
Y luego continúa publicando las llamadas onNotify () que activan las llamadas onCharacteristicChanged () incluso después de que la aplicación haya finalizado awile hace:
D/BluetoothGatt﹕ onNotify() - Device=54:4A:16:26:A1:B5 UUID=0000ffe1-0000-1000-8000-00805f9b34fb
¿Algún consejo sobre cómo desconectarse correctamente de las notificaciones características de GATT al salir de una aplicación?
- Android BLE API: GATT Notificación no recibida
- La devolución de llamada de Gatt de BLuetooth no funciona con la nueva API de Lollipop
- BLE con Android 5.0: ¿Cómo conseguir que un dispositivo actúe como Central AND Server?
- Cómo solucionar el error BluetoothGatt: android.os.DeadObjectException error en Android?
- BluetoothGatt que muestra 10.000 características idénticas para el servicio
- Android Cómo leer las propiedades de BLE Readable Writable Notifiable GATT Características
- Android BLE 4.3 onDescriptorWrite devuelve el estado 128 al habilitar la notificación de características
- Samsung ble api no puede recibir notificación de múltiples características del GATT
Parece que no puedes llamar a estos métodos juntos. La devolución de llamada de desconexión puede llegar más tarde que el método close () realizado.
Puede agregar mGatt.close (); En onConnectionStateChange la devolución de llamada para cerrar la conexión.
- El método de conexión del cliente API de Google congela la interfaz de usuario cuando no hay conexión a Internet
- Matar una aplicación, Android es el camino correcto en este proceso.