2012-07-11 79 views
3

我有一個支持OBEX對象推送配置文件的設備,此配置文件基於串行端口配置文件。我的猜測是我可以使用Android藍牙聊天示例將此設備連接到我的Android手機。但是我遇到了一個問題,關於android SDK中的socket.accept()功能。我盡力去完成我的電話與該設備這樣的連接:BluetoothServerSocket接受失敗並拋出IOException

adapter = BluetoothAdapter.getDefaultAdapter(); 
device = adapter.getRemoteDevice("00:1B:DC:0F:EC:7E"); 

AcceptThread = new AcceptThread(true, adapter, device); 
AcceptThread.start(); 

在AcceptThread構造函數編碼是這樣的:

public AcceptThread(boolean secure, BluetoothAdapter adapter, BluetoothDevice device) { 
    BluetoothServerSocket tmp = null; 
    this.adapter = adapter; 
    this.device = device; 

    // Create a new listening server socket 
    try { 
     tmp = adapter.listenUsingInsecureRfcommWithServiceRecord(device.getName(), UUID.fromString("00001101-0000-1000-8000-00805F9B34FB")); 
    } catch (Exception e) { 
     Log.e(TAG, ".AcceptThread # listen() failed", e); 
    } 
    mmServerSocket = tmp; 
} 

問題是,當我嘗試做一個connect()正如我說的前

public void run() { 
    BluetoothSocket socket = null; 

    // Listen to the server socket if we're not connected 
    while (mState != STATE_CONNECTED) { 
     try { 
      // This is a blocking call and will only return on a 
      // successful connection or an exception 
      Log.d(TAG, "AcceptThread.run: accepting server socket connection"); 

      socket = mmServerSocket.accept(20000); 

      Log.d(TAG, ".AcceptThread.run # server socket connection accepted"); 
     } catch (Exception e) { 
      Log.e(TAG, ".run # accept() failed: "+e); 
      break; 
     } 
    } 
} 

正如你可以看到的ServerSocket接受20 seconds20000 ms.當時間到了,該應用程序的無線進來的每一個連接會拋出一個IOException像這樣

07-11 10:30:08.355: E/SIMPLECONNECT(1301): .run # accept() failed: java.io.IOException: Connection timed out 

它告訴我,我的設備無法連接到我的android手機。該設備沒有顯示器上的連接按鈕,只是一個發送功能,它將文件發送到我的手機。我相信這個發送功能也會在後臺進行連接,但我不確定。

任何人都可以爲我找出任何解決方案嗎?我正在運行我的應用Samsung Galaxy SIIIAndroid 4.0.4

+1

在三星xcover相同的問題,seemes是一個三星的問題,因爲我的其他設備適用於相同的代碼。我向三星的支持報告了這個問題,但我並不期待...所以我會開始一個小賞金。 – 2red13 2012-08-06 18:06:40

回答

9

我終於解決了它,問題是,不同的Android版本和不同的設備seemes需要不同的套接字。我試用了三星Galaxy XCOVER,Tab1,Tab2,Nexus,Note,摩托羅拉Defy和HTC Flyer。 我使用的套接字是:

答:

Method m = mmDevice.getClass().getMethod("createRfcommSocket", new Class[] { int.class }); 
mSocket = (BluetoothSocket) m.invoke(mmDevice, Integer.valueOf(1)); 

B:

Method m = mmDevice.getClass().getMethod("createInsecureRfcommSocket", new Class[]{int.class}); 
mSocket=(BluetoothSocket)m.invoke(mmDevice,Integer.valueOf(1)); 

C:

mSocket=BluetoothAdapter.getDefaultAdapter().getRemoteDevice(mmDevice.getAddress()).createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB")); 

的Android 4.0.x的工程的Nexus,傳單,TAB1與A,B Android 4.0.3適用於Tab2 with B Android 3,6,x wo rks for DEFY with A,B Android 2.3.6適用於XCOVER with C

我找不到適用於所有設備和解決方案的解決方案;我無法找到女巫套接字在我創建和使用套接字,特別是XCOVER爲所有套接字執行connect()而不會引發異常,但是如果我嘗試寫入write(),則會發生。所以,如果你想設置一個bloothoh連接極其適用於所有設備你必須創建套接字,連接一個寫,然後記住這個套接字哪些工作(例如在首選項)

+0

你能分享你如何編寫偏好?由於它只保存數字,布爾值和字符串,因此我無法將套接字保存在首選項中。 – imcc 2012-09-14 18:54:57

+2

我不保存套接字,而是一個整數。然後我在OnCreate中有一個switch(),並決定使用哪個套接字並使用OptionMenu來更改套接字。 – 2red13 2012-09-18 06:14:42

相關問題