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:

 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?

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.

https://code.google.com/p/android/issues/detail?id=183108

  • ¿Cómo enviar datos a través de un enlace Bluetooth Low Energy (BLE)?
  • ¿Por qué setCharactersticNotification () no habilita realmente las notificaciones?
  • Android, ¿Cómo puedo hacer que el dispositivo BLE esté conectado a un dispositivo (vinculado)
  • Cambio de tiempo de gatt de bajo consumo de energía de bluetooth o descarga de flujo de lectura para detectar el evento de desconexión más rápido
  • ¿Cómo mejorar el rendimiento de GATT de baja energía de Bluetooth de Android?
  • BluetoothGattServer cancelConnection no cancela la conexión
  • Notificación de baja energía del bluetooth
  • Lectura de múltiples características de un dispositivo BLE de forma sincrónica (método recomendado para Android)
  • Desactivar con fuerza el dispositivo BLE conectado a la aplicación de Android activa onConnectionStateChange con el estado 8
  • BLE GATT onCharacteristicChanged no se llama después de suscribirse a la notificación
  • BluetoothDevice.ConnectGatt () con el parámetro de transporte
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.