android藍牙斷開
❶ Android BLE藍牙連接異常處理
藍牙通信過程中異常很常見,大致有以下幾種:
1,連接
2,發現服務
3,讀寫
4,通知
連接失敗可能是設備端原因,也可能是手機端原因。不同的手機來自不同的廠家,用的不同的晶元和藍牙協議棧都會導致藍牙功能的表現不一致,這都會導致各式各樣的兼容性問題,可能有的手機連接成功率高,有的成功率低。設備端原因可能有些時候出現異常導致死機無響應,或某些參數設置得有問題。但對於Android應用層開發來說,能做的很有限,藍牙通信是在系統服務進程中處理的,我們無法跨進程改變系統的行為,如果是在一個進程我們還可能通過Hook等手段來調整其內在邏輯。另外應用層的介面只是將請求封裝傳遞給系統服務進程,並未做一些實質性的通信,所以應用層雖然是同一個進程的,但是Hook意義也不大。所以我們能做的僅僅是看怎樣調整介面的調用,使得整體穩定性更好一點而已。
連接失敗分兩種,一種是超時,一種是提前返回失敗。
關於超時,一般是設備不在周圍,或設備斷電未發廣播,或設備當前被其他人連接。系統默認超時為30s,通常返回133,我們也可以自己設置更短的超時時間,超時則closeGatt,然後重新連接。
關於提前返回失敗,一般是有明確的異常,可能是手機藍牙的異常或者設備異常。
這兩種情況建議closeGatt,延時500ms,然後重試。如果重試三次仍然失敗,則可以考慮提示用戶重啟手機藍牙,或者檢查設備是否正常工作。
還有一種情況,連接成功後沒過多久連接又斷開了,這有可能是設備主動斷開,連接成功後有的設備會等待鑒權,如果一定時間內手機端還未發起鑒權則設備端主動斷開。也可能連接信道不夠穩定導致斷開的,此時closeGatt並重新連接即可。
當連接斷開時,會收到onConnectionStateChanged回調,這個回調可能會有一定延時,甚至有5s以上。解決的辦法是輪詢,如每隔1s發起一次讀請求,如果連接斷了會立即返回失敗。
如果藍牙連接不穩定,可以考慮關掉WIFI,因為WIFI通常和藍牙共用一個天線。
有的手機上discoverService可能會回調不止一次onServiceDiscover,這個要注意防禦。
當連接建立後,可以由設備端發起更改連接間隔,這樣能加快後續發現服務以及數據讀寫的速度。有的手機discover service很慢,原因是connect interval太大了,有的手機會主動向設備發起更改connect interval,而有的手機卻不會。這樣的話connect interval相差就會很大,實踐中發現有的手機是7ms,有的手機是默認的50ms,所以發現service都要8s,甚至20s的都很尋常,這對用戶來說是無法忍受的。所以比較好的辦法是設備主動發起更改connect interval,而Android系統是沒有提供對應API的。
如果發現服務失敗,通常來說不用closeGatt,重試一下就好了。如果重試三次還失敗,建議清一下緩存,再closeGatt,重新連接。
讀寫失敗要看失敗的原因是什麼,如果是許可權問題,則需要和設備端確認是否開放了相應的讀寫許可權。也可能是要讀寫的character不存在,可能是設備端修改了固件,手機端需要刷新一下藍牙緩存,closeGatt再重新連接。如果是其它未知錯誤,則重試三次,仍然失敗則closeGatt。不過通常來說如果是因為連接出了問題導致讀寫失敗的,會收到onConnectionStateChanged回調,此時就不用再無謂的重試了,直接closeGatt,重新連接。
打開/關閉character的notify,必須等收到onDescriptorWrite回調之後才算結束,才能開始下一個任務。
如果打開notify失敗,則可以改成周期性輪詢的方式去查詢character的值。
可參考該文章
Android-BLE-Issues
❷ 如何讓android 藍牙連接之後斷開,再自動嘗試連接
手機連接藍牙設備後會自動斷開連接,建議檢查:
1.查看藍牙設備是否遠離機器。
2.手機是否開啟了飛行模式或超級省電模式。若開啟,手機將會關閉藍牙功能。如需使用藍牙,需要重新開啟。
3.將手機關機重啟。
4.若依然自動斷開藍牙連接,建議更換其他藍牙設備嘗試。
5.若無效,請檢查手機是否有系統更新推送通知。若有,將手機升級到最新版本。
6.若問題依然存在,請備份手機數據,將機器恢復出廠設置嘗試。
若上述操作後手機仍然自動斷開藍牙連接,請您攜帶購機發票、包修卡和機器送到三星服務中心檢測。
❸ Android手機藍牙不能用怎麼辦
Android手機藍牙不能用,可重啟一次手機,藍牙硬體會在重啟過程中會自動被重置。重啟後藍牙功能就可以正常啟動了。