2013-02-09 309 views
7

我正在嘗試檢測藍牙設備當前是否連接到使用API​​ 14或更高版本的Android設備。看起來我應該可以使用BluetoothSocket.isConnected()方法,但無論我做了什麼,到目前爲止,我只是爲了任何東西,連接或不連接而返回假。Android BluetoothSocket.isConnected總是返回false

AndroidManifest包括這些行:

<uses-permission android:name="android.permission.BLUETOOTH" /> 
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> 

<!-- Locale 4.x supports API 14 or greater. --> 
<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="17" /> 

<uses-feature android:name="android.hardware.bluetooth" /> 

,問題中的代碼:

protected void onCreate(final Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices(); 

    for (BluetoothDevice device : pairedDevices) { 
     Log.i(Constants.LOG_TAG, String.format(Locale.US, "Device: %s connected: %b", device.getName(), isConnected(device))); //$NON-NLS-1$z 
    } 
} 

private boolean isConnected(BluetoothDevice device) { 
    BluetoothSocket socket = null; 

    // Get a BluetoothSocket for a connection with the given BluetoothDevice 
    UUID SPP_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); 
    try { 
     socket = device.createRfcommSocketToServiceRecord(SPP_UUID); 
    } catch (IOException e) { 
     Log.e(Constants.LOG_TAG, e.getMessage()); //$NON-NLS-1$z 
     return false; 
    } 

    Log.i(Constants.LOG_TAG, socket.toString()); //$NON-NLS-1$z 

    return socket.isConnected(); 
} 

不會引發任何錯誤,它只是返回 「假」 的時間100%。有沒有我不擅長的事情?

回答

0

首先,你爲什麼要使用反射?這是我的一面紅旗。這些API允許您通過藍牙與其他設備通話,請參閱this link,這樣您就不應該使用反射。

在調用方法connect之前,套接字將始終返回未連接狀態。看起來你的代碼獲取套接字,但從來沒有試圖與它建立連接。您首先需要撥打this method

+0

反射部分來自這個問題的接受答案:http://stackoverflow.com/questions/3397071/service-discovery-failed-exception-using-bluetooth-on-android。我對反思的想法並不感到激動,但我想我記得在別的地方讀過,你不應該依賴原始問題中的UUID。 話雖如此,對我來說重要的問題是你的答案的第二部分 - 我試圖找到任何連接的BT設備,而不是試圖連接任何我自己。這不可能嗎?我試圖避免必須創建一個服務來監視BT狀態的變化。 – jkane001 2013-02-10 00:05:25

+0

Ameen說得對,經過對SO答案和Android文檔的更仔細的閱讀後,我意識到在這裏沒有必要進行反思。我用一個更好的「isConnected」方法更新了我的原始問題,但我的問題仍然存在:有沒有辦法檢測BT設備是否連接而不連接它? – jkane001 2013-02-10 00:17:22

2

我相信jkane001已經解決了他的問題,所以我希望這個答案能夠幫助別人。

首先插座創建後

socket = device.createRfcommSocketToServiceRecord(SPP_UUID); 

你要初始化由

socket.connect(); 

連接後,你就可以使用socket.isConnected()

由於connect()方法是檢查連接狀態不會阻塞,因此在套接字可能尚未連接之後立即進行。我建議使用這樣的

while(!socket.isConnected() && trial++ < 3){ 
    try { 
     Thread.sleep(300); 
    } catch (Exception e) {} 
} 

順便說一句,我發現,在一些Android設備isConnected()始終返回false。在這種情況下,只需嘗試將某些內容寫入套接字並檢查是否沒有異常。

+0

我發現連接因信號不佳而丟失後,如果調用isConnected(),它仍然返回True。所以我採取了發送一些東西到套接字和捕捉異常。 – VectorVictor 2017-02-10 18:10:17

+0

@VectorVictor正確。 isConnected()不是檢查連接是否存活的可靠方法。 – Alex 2017-02-13 09:30:14

2

顯然有實現isConnected()的設備和/或Android版本(即該函數存在並且可以調用它),但是比無用的更糟糕,因爲它總是返回false。我在運行Android 4.2.2的桌面上安裝了Alcatel手機,該手機展現了這種行爲。

我的代碼假設它是斷開的,所以殺死了我的連接線程,這讓我瘋狂了很長時間。但是,我刪除了isConnected()調用,並假定它已連接,並且一切正常!我沒有找到更好的方法來檢查有效的連接,而不是等待錯誤並聲明連接已經死亡。線程中被阻塞的read()最終會失敗。

我們有來自現場的報告,聲音相似,並且我們知道該版本的2個問題設備中的2個也在4.2.2上。尚未部署修復程序,因此不確定它是否修復了這些情況。