2012-10-04 77 views
0

通過藍牙一個連接到設備的I使用Android BluetoothChat的變形來連接到設備逐一:機器人:由一個

  1. 嘗試連接到設備
  2. 如果連接已失敗則連接到另一設備
  3. 如果連接,然後嘗試讀取設備中的數據,然後連接到另一臺設備 等

但我得到一個異常服務發現失敗三星嘎laxy i-9000(Android 2.3)上的一行mmSocket.connect()。

問題是,當我在HTC Desire(Android 2.2)上使用我的應用程序時,它工作正常。

但是,當我在套接字連接之前添加了Thread.sleep(...)時,套接字在Samsung和HTC上始終成功連接。

Android版本或代碼有問題嗎?

下面是代碼:

private class ConnectThread extends Thread { 
private final BluetoothSocket mmSocket; 
    private final BluetoothDevice mmDevice; 
    private boolean mIsCanceled = false; 

    public ConnectThread(BluetoothDevice device) { 
     mmDevice = device; 
     BluetoothSocket tmp = null; 

     if(LOG_ENABLED) Log.d(TAG, "create mConnectThread " + mmDevice.getAddress()); 

     // Get a BluetoothSocket for a connection with the 
     // given BluetoothDevice 

     try 
     { 
      tmp = device.createRfcommSocketToServiceRecord(SerialPortServiceClass_UUID); 
      if(LOG_ENABLED) Log.d(TAG, "create socket"); 
     } 
     catch (IOException e) { 
      if(LOG_ENABLED) Log.e(TAG, "create() failed", e); 
     } 

     mmSocket = tmp; 
    } 

    public void run() { 
     if(LOG_ENABLED) Log.d(TAG, "run mConnectThread " + mmDevice.getAddress()); 

     // Always cancel discovery because it will slow down a connection 
     mAdapter.cancelDiscovery(); 

     /* 
     With this code commented "mmSocket.connect()" throws an exception 
     Service discovery failed on Samsung Galaxy S 
     try { 
      Thread.sleep(5000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     }*/ 

     if(mIsCanceled) return; 

     // Make a connection to the BluetoothSocket 
     try { 
      // This is a blocking call and will only return on a 
      // successful connection or an exception 
      if(LOG_ENABLED) Log.d(TAG, "socket.connect() " + mmDevice.getAddress()); 
      mmSocket.connect(); 
     } catch (Exception e) { 

      if(LOG_ENABLED) Log.e(TAG, e.getMessage() + " " + mmDevice.getAddress(), e); 

      try { 
       mmSocket.close(); 
       if(LOG_ENABLED) Log.d(TAG, "mConnectThread mmSocket.close() " + mmDevice.getAddress()); 
      } catch (IOException e1) { 

       if(LOG_ENABLED) Log.e(TAG, "mConnectThread mmSocket.close() error" + mmDevice.getAddress()); 
       if(LOG_ENABLED) Log.e(TAG, e1.getMessage() + " " + mmDevice.getAddress(), e1); 
      } 

      connectionFailed(mmDevice.getAddress()); 

      return; 
     } 

     // Reset the ConnectThread because we're done 
     synchronized (CBluetoothAdapter.this) { 
      mConnectThread = null; 
     } 

     // Start the connected thread 
     connected(mmSocket, mmDevice); 
    } 

    public void cancel() { 
     try { 
      mmSocket.close(); 
      if(LOG_ENABLED) Log.d(TAG, "mConnectThread socket close() " + mmDevice.getAddress()); 
     } catch (IOException e) { 
      if(LOG_ENABLED) Log.e(TAG, "mConnectThread close() of connect socket failed " + mmDevice.getAddress(), e); 
     } 

     mIsCanceled = true; 
    } 
} 

這是從logcat的:

10-04 12:54:57.035: D/CBluetoothAdapter(27291): Start connect 00:0A:84:02:77:6F 
10-04 12:54:57.039: D/CBluetoothAdapter(27291): Connecting to device 00:0A:84:02:77:6F 
10-04 12:54:57.039: D/CBluetoothAdapter(27291): connect to: 00:0A:84:02:77:6F 
10-04 12:54:57.039: D/CBluetoothAdapter(27291): create mConnectThread 00:0A:84:02:77:6F 
10-04 12:54:57.187: D/CBluetoothAdapter(27291): create socket 
10-04 12:54:57.187: D/CBluetoothAdapter(27291): State changed: CONNECTING 
10-04 12:54:57.191: D/CBluetoothAdapter(27291): run mConnectThread 00:0A:84:02:77:6F 
10-04 12:54:57.203: D/CBluetoothAdapter(27291): socket.connect() 00:0A:84:02:77:6F 
10-04 12:55:03.234: E/CBluetoothAdapter(27291): Service discovery failed 00:0A:84:02:77:6F 
10-04 12:55:03.234: E/CBluetoothAdapter(27291): java.io.IOException: Service discovery failed 
10-04 12:55:03.234: E/CBluetoothAdapter(27291):  at  android.bluetooth.BluetoothSocket$SdpHelper.doSdp(BluetoothSocket.java:406) 
10-04 12:55:03.234: E/CBluetoothAdapter(27291):  at android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:217) 
10-04 12:55:03.234: E/CBluetoothAdapter(27291):  at  scatemobile.adapters.CBluetoothAdapter$ConnectThread.run(CBluetoothAdapter.java:473) 
10-04 12:55:03.253: D/CBluetoothAdapter(27291): mConnectThread mmSocket.close() 00:0A:84:02:77:6F 
10-04 12:55:03.253: D/CBluetoothAdapter(27291): Connection failed 00:0A:84:02:77:6F 
10-04 12:55:03.253: D/CBluetoothAdapter(27291): Disconnect 00:0A:84:02:77:6F 
10-04 12:55:03.253: D/CBluetoothAdapter(27291): mConnectThread socket close() 00:0A:84:02:77:6F 
10-04 12:55:03.253: D/CBluetoothAdapter(27291): State changed: DISABLED 
10-04 12:55:03.253: D/CBluetoothAdapter(27291): Start connect 00:1D:28:92:A2:D1 
10-04 12:55:03.257: D/CBluetoothAdapter(27291): Connecting to device 00:1D:28:92:A2:D1 
10-04 12:55:03.257: D/CBluetoothAdapter(27291): connect to: 00:1D:28:92:A2:D1 
10-04 12:55:03.257: D/CBluetoothAdapter(27291): create mConnectThread 00:1D:28:92:A2:D1 
10-04 12:55:03.257: D/CBluetoothAdapter(27291): create socket 
10-04 12:55:03.261: D/CBluetoothAdapter(27291): Send msg MSG_CONNECTION_FAILED 00:0A:84:02:77:6F  1079579976 
10-04 12:55:03.273: D/CBluetoothAdapter(27291): State changed: CONNECTING 
10-04 12:55:03.273: D/CBluetoothAdapter(27291): run mConnectThread 00:1D:28:92:A2:D1 
10-04 12:55:03.289: D/CBluetoothAdapter(27291): socket.connect() 00:1D:28:92:A2:D1 
10-04 12:55:09.304: E/CBluetoothAdapter(27291): Service discovery failed 00:1D:28:92:A2:D1 
10-04 12:55:09.304: E/CBluetoothAdapter(27291): java.io.IOException: Service discovery failed 
10-04 12:55:09.304: E/CBluetoothAdapter(27291):  at  android.bluetooth.BluetoothSocket$SdpHelper.doSdp(BluetoothSocket.java:406) 
10-04 12:55:09.304: E/CBluetoothAdapter(27291):  at  android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:217) 
10-04 12:55:09.304: E/CBluetoothAdapter(27291):  at scatemobile.adapters.CBluetoothAdapter$ConnectThread.run(CBluetoothAdapter.java:473) 
10-04 12:55:09.312: D/CBluetoothAdapter(27291): mConnectThread mmSocket.close() 00:1D:28:92:A2:D1 
10-04 12:55:09.312: D/CBluetoothAdapter(27291): Connection failed 00:1D:28:92:A2:D1 
10-04 12:55:09.316: D/CBluetoothAdapter(27291): Disconnect 00:1D:28:92:A2:D1 
10-04 12:55:09.316: D/CBluetoothAdapter(27291): mConnectThread socket close() 00:1D:28:92:A2:D1 
10-04 12:55:09.316: D/CBluetoothAdapter(27291): State changed: DISABLED 
10-04 12:55:09.316: D/CBluetoothAdapter(27291): Send msg MSG_CONNECTION_FAILED 00:1D:28:92:A2:D1  1079579976 
10-04 12:55:09.320: D/CBluetoothAdapter(27291): Start connect 00:0A:84:02:77:70 
10-04 12:55:09.324: D/CBluetoothAdapter(27291): Connecting to device 00:0A:84:02:77:70 
10-04 12:55:09.324: D/CBluetoothAdapter(27291): connect to: 00:0A:84:02:77:70 
10-04 12:55:09.324: D/CBluetoothAdapter(27291): create mConnectThread 00:0A:84:02:77:70 
10-04 12:55:09.328: D/CBluetoothAdapter(27291): create socket 
10-04 12:55:09.335: D/CBluetoothAdapter(27291): State changed: CONNECTING 
10-04 12:55:09.339: D/CBluetoothAdapter(27291): run mConnectThread 00:0A:84:02:77:70 
10-04 12:55:09.343: D/CBluetoothAdapter(27291): socket.connect() 00:0A:84:02:77:70 
10-04 12:55:15.359: E/CBluetoothAdapter(27291): Service discovery failed 00:0A:84:02:77:70 
10-04 12:55:15.359: E/CBluetoothAdapter(27291): java.io.IOException: Service discovery failed 
10-04 12:55:15.359: E/CBluetoothAdapter(27291):  at  android.bluetooth.BluetoothSocket$SdpHelper.doSdp(BluetoothSocket.java:406) 
10-04 12:55:15.359: E/CBluetoothAdapter(27291):  at  android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:217) 
10-04 12:55:15.359: E/CBluetoothAdapter(27291):  at  scatemobile.adapters.CBluetoothAdapter$ConnectThread.run(CBluetoothAdapter.java:473) 
10-04 12:55:15.367: D/CBluetoothAdapter(27291): mConnectThread mmSocket.close() 00:0A:84:02:77:70 
10-04 12:55:15.367: D/CBluetoothAdapter(27291): Connection failed 00:0A:84:02:77:70 
10-04 12:55:15.367: D/CBluetoothAdapter(27291): Disconnect 00:0A:84:02:77:70 
10-04 12:55:15.367: D/CBluetoothAdapter(27291): mConnectThread socket close() 00:0A:84:02:77:70 
10-04 12:55:15.367: D/CBluetoothAdapter(27291): State changed: DISABLED 
10-04 12:55:15.375: D/CBluetoothAdapter(27291): Start connect 00:0A:84:02:5F:3A 
10-04 12:55:15.375: D/CBluetoothAdapter(27291): Send msg MSG_CONNECTION_FAILED 00:0A:84:02:77:70 1079579976 

回答

2

我改變了我的代碼。 現在我使用反射創建的BluetoothSocket:

Method m; 

m = device.getClass().getMethod("createRfcommSocket", new Class[]{int.class}); 
tmp = (BluetoothSocket)m.invoke(device, 1); 

而且這對我的作品! 問題解決了。