Android BLE低功耗藍牙重啓手機後自動連接失敗問題

最近在做安卓開發,用到藍牙模塊相關功能。主要功能是使用手機連上低功耗藍牙設備,比如藍牙手環。關於如何藍牙連接在這裏就不講述了,網上搜索一大堆相關教程。想要來這裏看藍牙連接方式的朋友可能要大失所望了。

連接藍牙成功後,因爲藍牙連手環一直是處於長連的狀態。所以我在APP重啓的時候做了一個自動重連的功能。主要就是在掃描結果的方法中去檢測上一次連接的藍牙設備地址,匹配上之後自動調用connectGatt()方法進行重連。

     

 其中address是上次APP關閉前連接的藍牙設備地址。在這裏我是保存到了sharepreference當中,然後在onCreate()的時候重新拿出來.接着直接調用BluetoothAdapter.getRemoteDevice()獲取一個device實例去連接。

 注:不用在意那些紅線,只是警告,版本問題

這麼做其實沒有問題,重啓APP後也能很快的連接上。

然而,奇葩的問題來了,在重啓手機後,在重新打開APP,就connectGatt()連接失敗了。由於我設置的是連接失敗後就不斷循環去重連,而connectGatt()連接失敗的話會有一個很長的響應超時時間,大概在30S左右才能進入回調方法BluetoothGattCallback()當中。而且提示

onClientConnectionState() - status=133 clientIf=5 device=F2:XX:XX:XX:XX:XX

看到133錯誤,首先是各種百度、論壇、博客找,好多大牛都說是因爲上次藍牙連接沒有close()釋放資源的原因。然而我根據大牛們的建議去嘗試修改,然而並沒什麼卵用。

素質疑問三連:爲什麼重啓APP不會出現問題,而重啓手機再打開APP就回出現問題呢?APP重啓了資源不是也跟着釋放了嗎?APP重啓和手機重啓的區別在哪裏呢?

百度無果,只能去看看源碼了。我去研究了connectGatt()方法,然而卻發現我的問題定位錯了。其實並不是connectGatt()方法的問題。最後我發現是這個mBluetoothAdapter.getRemoteDevice(address)的問題,getRemoteDevice()方法雖然能得到一個device實例,但是如果你直接用他來connectGatt(),那麼久GG了。因爲手機重啓後,BluetoothAdapter也重新做了初始化,在沒有重新掃描的情況下,直接去使用getRemoteDevice(adress)去獲取device進行connectGatt(),是不會匹配上的。

問題就在於想要自動重連上,首先需要先進行一次掃描藍牙設備。所以我在掃描藍牙設備結果裏面做了修改。

當掃描到address相同的設備時,我再主動進行重連,如此一來,問題就解決了。

 

總結:假如要使用藍牙自動重連,必須考慮手機重啓的情況。BluetoothAdapter是系統變量,重啓手機的時候可能會把掃描的設備信息清理掉。這就會導致connectGatt()連接失敗。最好的方法是重啓APP後先手動掃描一次,在進行重連。

這問題難了我兩天時間,頭暈。網上也沒有找到相關問題的解決辦法,在此記錄一下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章