0
通過藍牙一個連接到設備的I使用Android BluetoothChat的變形來連接到設備逐一:機器人:由一個
- 嘗試連接到設備
- 如果連接已失敗則連接到另一設備
- 如果連接,然後嘗試讀取設備中的數據,然後連接到另一臺設備 等
但我得到一個異常服務發現失敗三星嘎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