我試圖在我退出應用程序時斷開特徵通知。這裏是我如何在我的exitCleanup()函數做:即使在斷開連接()後,Android BLE BluetoothGatt對象仍保持連接狀態並觸發onCharacteristicChanged()
if (btGatt != null && mWriteChar != null) {
boolean b=btGatt.setCharacteristicNotification(mWriteChar, false);
Log.w("AppInfo", "Exiting and Unsubscribing: " + b);
}
日誌顯示:Exiting and Unsubscribing: true
。到現在爲止還挺好。 我再嘗試斷開關貿總協定共使用下列對象:
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));
}
這就是事情變得怪異。該日誌現在顯示以下內容:FINISHING. Connection state=2
,表示BluetoothDevice仍處於連接狀態。
這是一個問題,因爲當應用程序完成並銷燬所有資產時,BluetoothGattCallback仍會繼續在幕後接收通知。首先,它引發以下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()
,然後繼續發佈onNotify()調用觸發onCharacteristicChanged()的應用程序已經awile前終止後也呼籲:如何
D/BluetoothGatt﹕ onNotify() - Device=54:4A:16:26:A1:B5 UUID=0000ffe1-0000-1000-8000-00805f9b34fb
任何意見從應用程序退出時,從GATT特徵通知中正確斷開連接?
嗨溫帶,我有同樣的問題。你能找到解決方案嗎?請分享。 – Brabbeldas
繞過此錯誤的唯一方法是禁用然後重新啓用藍牙設備,這是一種非常黑客的做法。我仍在尋找更好的建議。 – Temperage
在斷開和關閉之間放置了一段延遲,應該排除異常 – Amit