[英]Is calling disconnect() and close() subsequently the right approach in BLE Android app?
我正在努力實現一個連接到 BLE 設備的 Android 應用程序,但缺乏適當的文檔正在殺死我。 如果我運行該應用程序一次它可能工作但下一次停止在某處(不知道在哪里),則似乎沒有兩次以相同的方式工作,但我得出的結論是我可能沒有使用disconnect()
和close()
以正確的順序。
在說一個錯誤之后,我首先調用 disconnect() :
public void disconnect() {
mScanning = true;
mConnected = false;
startedConnect = false;
if (mBluetoothAdapter == null || mBluetoothGatt == null) {
scanLeDevice(true);
return;
}
mBluetoothGatt.disconnect();
scanLeDevice(true);
}
然后我調用close():
public void close() {
if (mBluetoothGatt == null) {
return;
}
mBluetoothGatt.close();
mBluetoothGatt = null;
}
這是正確的做法還是錯誤的做法? 請注意,我正在調用scanLeDevice(true);
斷開連接后立即調用close()
,我認為這只是“完成”一切並停止掃描,對嗎?
當創建BluetoothGatt
通過調用對象connectGatt
上的BluetoothDevice
,則權利要求32中的一個(在目前的Android版本)在藍牙棧可用時隙。
如果 Android 是否應該嘗試保持與設備的連接,您現在可以在此對象上調用connect
和disconnect
來更改“目標”的狀態。 在您調用disconnect
,Android 將(永遠)嘗試連接到設備並在連接因任何原因斷開時自動重新連接到設備。 disconnect
connect
后再次調用connect
將使其嘗試再次連接。
注:設置autoConnect
到false
初始connectGatt
調用將設置第一個隱含的連接嘗試(通常為30秒)的初始超時,如果設備連接和連接后下降,它不會自動嘗試重新連接。
因此, BluetoothGatt
對象可以處於“斷開連接”狀態,但仍會占用藍牙堆棧中的 32 個插槽之一。 當您調用close
,您會釋放BluetoothGatt
對象的所有資源並將插槽返回到藍牙堆棧。 因此,關閉也隱含地意味着斷開連接。 要潛在地解決一些有問題的 Android 設備,您可以在close
之前調用BluetoothGatt
對象上的disconnect
。 請注意,一旦您調用了close
,您就無法在該BluetoothGatt
對象上調用任何其他方法。
注意:關閉藍牙意味着自動銷毀所有BluetoothGatt
對象。
回到你的問題,我真的不明白你的 BLE 掃描與連接/斷開/關閉有什么關系。 掃描與連接和BluetoothGatt
對象完全分開,並且連接和同時執行掃描沒有問題。 要停止掃描,請在BluetoothLeScanner
上調用stopScan
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.