2011-05-18 39 views
1

嗨 我想實現一個藍牙庫,並在其中我想連接一次rfcomm套接字,然後在所有調用中重複使用它。 我想知道它是否連接,以便知道我是否應該調用connect方法。 我無法在藍牙套接字的源代碼中找到任何內容,因爲它都是本機調用,並且在API中沒有定義isConnected方法...有沒有人有過這方面的經驗?Android,BluetoothSocket - 如何判斷連接是否已經存在,或者是否需要調用連接?

回答

1

我想你會有一個成員變量保持連接的狀態。在成功的連接上將它設置爲true,啓動一個線程,該線程總是從套接字輸入流中讀取字節,並且如果在該線程上發生IOException,則將您的標誌設置爲false。

+0

因爲我想寫一個同步(阻塞)調用方法,我會做一個寫然後馬上讀,這意味着我將無法維持循環並始終嘗試讀取的線程。然而,如果我理解你的答案是正確的,你說我應該假設,如果我從套接字的輸入或輸出流中得到一個讀取異常,我可以認爲連接已經死亡。那是對的嗎? – ekatz 2011-05-19 15:15:19

+0

是afaik如果你得到任何ioexception,你可以認爲它死了 – jkhouw1 2011-05-19 15:32:08

+0

是IO異常或「藍牙斷開」的意圖告訴我們,連接已經死亡。檢查出https://github.com/gtosoft/libvoyager/blob/master/src/com/gtosoft/libvoyager/android/ELMBT.java – 2011-05-19 16:53:34

1

我回答了類似的問題here。從API Level 14開始,可以使用BluetoothSocket類中的isConnected方法。對於較低的API級別,您可以打開一個套接字,完成您的工作並再次關閉它。然而,有些事情你可能需要考慮,更多的鏈接答案。

+0

某些設備總是返回false方法isConnected – Anthone 2015-02-12 14:40:39

+0

@Anthone afaik每規格應該工作。所以如果它不起作用,我會認爲這是一個異常,它可能是有意義的提交錯誤報告。也可以暫時使用Icsmoretto的答案。 – AgentKnopf 2015-02-13 10:12:24

+0

謝謝,省去了接線不必要的代碼 – Joseph 2017-08-20 20:42:46

1

isConnected()從來不適合我。 嘗試是這樣的:

try { 
    mSocket.connect() 
} catch (IOException e) { 
    // Create a new socket 
    // mSocket.connect(); 
} 
+1

如果列出isConnected不工作的設備並且可能爲他們提供錯誤報告,這可能會有所幫助嗎? – AgentKnopf 2015-02-13 10:10:28