2015-04-26 75 views
6

我試圖在我退出應用程序時斷開特徵通知。這裏是我如何在我的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特徵通知中正確斷開連接?

+0

嗨溫帶,我有同樣的問題。你能找到解決方案嗎?請分享。 – Brabbeldas

+0

繞過此錯誤的唯一方法是禁用然後重新啓用藍牙設備,這是一種非常黑客的做法。我仍在尋找更好的建議。 – Temperage

+0

在斷開和關閉之間放置了一段延遲,應該排除異常 – Amit

回答

相關問題