蓝牙sockets冻结手机

我正在开发Android的应用程序。 这个应用程序应该与蓝牙(BT)设备(发送一些字节)进行通信。 我在我的设备(Samsung Galaxy mini)上debugging/运行此应用程序时遇到问题。 当我创build一个BT套接字并停止debugging时,电话会冻结,我必须通过取出电池重新启动它。 在运行这个应用程序的情况下(从Eclipse)一切正常,但是当我尝试再次运行它,电话冻结和应用程序未安装。 如果我尝试在第二次运行之前卸载此应用程序,请再次冻结手机。 这是一个有问题的代码:

private final BluetoothDevice mmDevice; private UUID uuid; public ConnectionThread(BluetoothDevice device) { Log.d(TAG, "create ConnectionThread"); uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); BluetoothSocket tmp = null; mmDevice = device; try { tmp = mmDevice.createRfcommSocketToServiceRecord(uuid); } catch (IOException e) { } mmSocket = tmp; socketConnected = true; } 

这是线程的构造函数。 当我评论这一行时

  tmp = mmDevice.createRfcommSocketToServiceRecord(uuid); 

手机不冻结所以问题是创build套接字(不连接)。 每次debugging或运行后重新启动手机都非常烦人,我还得做很多工作。

如果我从手机上运行这个应用程序(从Eclipse断开),它没有任何问题。 任何想法可能是一个问题或如何解决它? 谢谢。

Solutions Collecting From Web of "蓝牙sockets冻结手机"

我也使用SGSIII mini进行开发。 以下代码适合我:

  private class ConnectThread extends Thread { private final BluetoothSocket mmSocket; private final BluetoothDevice mmDevice; public ConnectThread(BluetoothDevice device) { mmDevice = device; BluetoothSocket tmp = null; // Get a BluetoothSocket for a connection with the // given BluetoothDevice try { //tmp = device.createRfcommSocketToServiceRecord(MY_UUID); tmp = device.createInsecureRfcommSocketToServiceRecord(MY_UUID); } catch (IOException e) { Log.e(LOG_TAG, "create() failed", e); } mmSocket = tmp; Main.myBluetoothSocket = mmSocket; Main.myBluetoothDevice = mmDevice; } @Override public void run() { Log.i(LOG_TAG, "BEGIN mConnectThread"); setName("ConnectThread"); // Always cancel discovery because it will slow down a connection mAdapter.cancelDiscovery(); // Send a failure message back to the Activity Message msg = mHandler.obtainMessage(MESSAGE_TOAST); Log.e(LOG_TAG, "Attempting connection to " + mmSocket.getRemoteDevice().getName()); String ss = "Attempting connection to " + mmSocket.getRemoteDevice().getName(); Bundle bundle = new Bundle(); bundle.putString(TOAST, ss); msg.setData(bundle); mHandler.sendMessage(msg); // Make a connection to the BluetoothSocket try { // This is a blocking call and will only return on a // successful connection or an exception mmSocket.connect(); } catch (IOException e) { Log.e(LOG_TAG, "*+*+*+* Connection Failed"); connectionFailed(); // Close the socket try { mmSocket.close(); } catch (IOException e2) { Log.e(LOG_TAG, "unable to close() socket during connection failure", e2); } // Start the service over to restart listening mode BluetoothCommandService.this.start(); return; } // Reset the ConnectThread because we're done synchronized (BluetoothCommandService.this) { mConnectThread = null; } // Start the connected thread connected(mmSocket, mmDevice); } public void cancel() { try { mmSocket.close(); } catch (IOException e) { Log.e(LOG_TAG, "close() of connect socket failed", e); } } } 

我也面临同样的问题,你可以使用reflection的方法,它将工作

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