11

我遇到了Android 6.0和一些藍牙低功耗設備的嚴重問題。其中一個抵觸的裝置是這樣的一種:Android 6.0棉花糖BLE連接問題

DEVICE INFO: 
Name:   Samsung Galaxy SV 
Model number: SM-G900V 
Android vers: 6.0.1 
Patch level: May 1, 2016 
Hard. vers: G900V.05 

如果我讓一些壓力測試基於連接和斷開該應用一個BLE外圍成功率勉強達到50%。

讀了Android的最新文檔,他們建議以指定connectGatt方法的最後一個參數的傳輸模式來執行BLE交通連接,而非BR/EDR:

device.connectGatt(this, false, mGattCallback, BluetoothDevice.TRANSPORT_LE); 

自認倒黴改善改變。

繼一些suggestions並閱讀了關於BLE連接問題後,我發現了三星Galaxy S6的幾個相關問題,並在one of those中提出了一系列解決BLE連接問題的步驟。關鍵之一是對clear Bluetooth Share system app數據。這樣做,連接率立即增加了幾乎100%的成功。但是,如果您等待和其他一些BLE應用程序一起玩並連接到其他外設,問題遲早會回來。

有在試圖解決這些BLE問題,他們基本上做的是谷歌播放some apps

/system/bin/rm -r /data/misc/bluetoothd/* 
/system/bin/rm -r /data/misc/hcid/* 

雖然這是一個方法來清除藍牙高速緩存,它需要植根是設備不是專業應用程序的合理解決方案。

我研究的私人Android API並沒有幫助我解決這個問題,而我發現的唯一類似的是enforce service discovery cache cleanup,這與問題無關。

使用BLE分組嗅探我看到ADV_CONNECT_REQ甚至沒有從設備發送到外圍設備,並在一段時間後在Android堆觸發BluetoothGattCallbackSTATE_DISCONNECTED事件。

我不完全知道爲什麼這個問題出現在一些6.0設備中,而不是其他的,因爲藍牙共享緩存似乎是問題所在。那裏存儲的是什麼?剛剛連接/配對的設備?我是唯一遇到這個問題的人嗎?如果不是,你們如何解決它?我不想指導最終用戶如何清除藍牙共享應用程序數據。

+0

測試這對S6邊緣,我可以證實,清除藍牙共享緩存和數據幫助其連接,而無需通過BluetoothDevice.TRANSPORT_LE參數。我失去了爲什麼會發生這種情況。清除緩存之前,它根本沒有連接。 –

+0

這很好,你知道我不是唯一一個。感謝@CanCanbek的反饋,希望有人能幫助我們。 – GoRoS

+0

我看了上面的內容,我明白了你的意思,在6.0系統上的S6 edge,在執行connectGatt()函數後,執行到cache操作,可以保證正常的手機和通信設備不會有耽擱。這是什麼意思?@ Can Canbek – amibition

回答

0

有一種叫做「removeBond」的隱藏方法。有時候,無法清楚地斷開無線設備,在這種情況下,您需要調用刪除鍵。從here

//remove authrization 
    Method method = null; 
    try { 
     method = gatt.getDevice().getClass().getMethod("removeBond", (Class[]) null); 
     method.invoke(gatt.getDevice(), (Object[]) null); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    }   
    gatt.disconnect(); 

此外

代碼,您可以使用隱藏方法 「刷新」 刷新關貿總協定服務。最初的刷新方法是更新gatt服務,但在某些不必要的斷開連接的情況下,您可能需要刷新以正確連接您的gatt服務。

How to programmatically force bluetooth low energy service discovery on Android without using cache