Bindlisten在启动Accept线程时失败

问题描述:

谁能告诉我这个问题是什么?我试图让我的应用程序启动一个Accept Thread,但是这个错误不断发生。Bindlisten在启动Accept线程时失败

任何人都可以帮忙吗?

我使用Android 2.1版HTC Hero。

ERROR/BluetoothChatService(9585): java.io.IOException: Bindlisten failed 

android.bluetooth.BluetoothAdapter.listenUsingRfcommWithServiceRecord(BluetoothAdapter.java:749) 

根据here

public BluetoothServerSocket listenUsingRfcommWithServiceRecord (String name, UUID uuid) 

Throws IOException on error, for example Bluetooth not available, or insufficient permissions, or channel in use. 

这里的一些代码: 我已经使用BluetoothChat.java为指导,制定以下代码参考。所以一旦启用蓝牙,用户将按下菜单按钮,然后出现三个按钮。用户选择server按钮,如果他们想要启动接受线程并成为游戏的主机。

public boolean onOptionsItemSelected(MenuItem item) { 
    Intent serverIntent = null; 
    switch (item.getItemId()) { 
    case R.id.scan: 
     // Launch the DeviceListActivity to see devices and do scan 
     serverIntent = new Intent(this, DeviceListActivity.class); 
     startActivityForResult(serverIntent, REQUEST_CONNECT_DEVICE_SECURE); 
     return true; 
    case R.id.discoverable: 
     // Ensure this device is discoverable by others 
     ensureDiscoverable(); 
     return true; 
    case R.id.server: 
     // Ensure this device is discoverable by others 
     if (mGameService != null) 
     { 
      // Only if the state is STATE_NONE, do we know that we haven't started already 
      if (mGameService.getState() == BluetoothChatService.STATE_NONE) 
      { 
       // Start the Bluetooth chat services 
       mGameService.start(); 
      } 
     } 
     return true; 
    } 
    return false; 
} 

一旦用户选择的Server按钮,就会调用下面的方法从另一个类:

public synchronized void start() { 
    if (D) Log.d(TAG, "start"); 

    // Cancel any thread attempting to make a connection 
    if (mConnectThread != null) {mConnectThread.cancel(); mConnectThread = null;} 

    // Cancel any thread currently running a connection 
    if (mConnectedThread != null) {mConnectedThread.cancel(); mConnectedThread = null;} 

    setState(STATE_LISTEN); 

    // Start the thread to listen on a BluetoothServerSocket 
    if (mSecureAcceptThread == null) { 
     mSecureAcceptThread = new AcceptThread(); 
     mSecureAcceptThread.start(); 
    } 
} 

然后这是Accept Thread。使用调试器,我可以确认执行了Accept Thread。然而,它未能在第一try catch,它永远不会执行该

tmp = mAdapter.listenUsingRfcommWithServiceRecord(NAME,MY_UUID); 

接受以下主题:

private class AcceptThread extends Thread { 
    // The local server socket 
    private final BluetoothServerSocket mmServerSocket; 

    public AcceptThread() { 
     BluetoothServerSocket tmp = null; 

     // Create a new list ening server socket 
     try { 
       tmp = mAdapter.listenUsingRfcommWithServiceRecord(NAME,MY_UUID); 
      } 
     catch (IOException e) { 
      Log.e(TAG, "Socket Type: " + "listen() failed", e); 
     } 
     mmServerSocket = tmp; 
    } 

    public void run() { 
     if (D) Log.d(TAG, "Socket Type: " + 
       "BEGIN mAcceptThread" + this); 
     setName("AcceptThread"); 

     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 
       socket = mmServerSocket.accept(); 
      } catch (IOException e) { 
       Log.e(TAG, "Socket Type: " + "accept() failed", e); 
       break; 
      } 

      // If a connection was accepted 
      if (socket != null) { 
       synchronized (BluetoothChatService.this) { 
        switch (mState) { 
        case STATE_LISTEN: 
        case STATE_CONNECTING: 
         // Situation normal. Start the connected thread. 
         connected(socket, socket.getRemoteDevice()); 
         break; 
        case STATE_NONE: 
        case STATE_CONNECTED: 
         // Either not ready or already connected. Terminate new socket. 
         try { 
          socket.close(); 
         } catch (IOException e) { 
          Log.e(TAG, "Could not close unwanted socket", e); 
         } 
         break; 
        } 
       } 
      } 
     } 
     if (D) Log.i(TAG, "END mAcceptThread, socket Type: "); 

    } 

我只是做了一些调试,发生在Accept Thread以下错误。在socket = mmServerSocket.accept();一行。

[2011-05-27 13:52:21 - DeviceMonitor]Adb connection Error:An existing connection was forcibly closed by the remote host 
[2011-05-27 13:52:21 - Logcat]An existing connection was forcibly closed by the remote host 
java.io.IOException: An existing connection was forcibly closed by the remote host 
    at sun.nio.ch.SocketDispatcher.read0(Native Method) 
    at sun.nio.ch.SocketDispatcher.read(Unknown Source) 
    at sun.nio.ch.IOUtil.readIntoNativeBuffer(Unknown Source) 
    at sun.nio.ch.IOUtil.read(Unknown Source) 
    at sun.nio.ch.SocketChannelImpl.read(Unknown Source) 
    at com.android.ddmlib.AdbHelper.executeRemoteCommand(AdbHelper.java:395) 
    at com.android.ddmlib.Device.executeShellCommand(Device.java:284) 
    at com.android.ddmuilib.logcat.LogPanel$3.run(LogPanel.java:527) 

[2011-05-27 13:52:23 - DeviceMonitor]Connection attempts: 1 
[2011-05-27 13:52:25 - DeviceMonitor]Connection attempts: 2 
[2011-05-27 13:52:27 - DeviceMonitor]Connection attempts: 3 
[2011-05-27 14:33:48 - Device]Error during Sync: timeout. 
[2011-05-27 16:49:43 - ddms]null 
java.lang.NullPointerException 
    at com.android.ddmlib.Client.sendAndConsume(Client.java:572) 
    at com.android.ddmlib.HandleHello.sendHELO(HandleHello.java:142) 
    at com.android.ddmlib.HandleHello.sendHelloCommands(HandleHello.java:65) 
    at com.android.ddmlib.Client.getJdwpPacket(Client.java:671) 
    at com.android.ddmlib.MonitorThread.processClientActivity(MonitorThread.java:317) 
    at com.android.ddmlib.MonitorThread.run(MonitorThread.java:263) 

[2011-05-27 16:49:43 - ddms]null 
java.lang.NullPointerException 
    at com.android.ddmlib.Client.sendAndConsume(Client.java:572) 
    at com.android.ddmlib.HandleHello.sendHELO(HandleHello.java:142) 
    at com.android.ddmlib.HandleHello.sendHelloCommands(HandleHello.java:65) 
    at com.android.ddmlib.Client.getJdwpPacket(Client.java:671) 
    at com.android.ddmlib.MonitorThread.processClientActivity(MonitorThread.java:317) 
    at com.android.ddmlib.MonitorThread.run(MonitorThread.java:263) 
+0

部分代码会很好... – 2011-05-27 13:49:18

+0

已添加一些代码 – Navigatron 2011-05-27 14:04:24

+0

我发现另一个Stack Overflow问题,但被删除。这家伙有我遇到的同样的问题。 [Question Link](http://www.androidportal.info/q23716/Bindlisten-Failed-Exception-while-connecting-two-android-device) 答案问他是否先创建了'RFCOMM'套接字,然而isn '客户端创建的'RFCOMM'套接字,而不是服务器设备? – Navigatron 2011-05-27 14:37:46

此代码不适用于HTC Hero。 我已经在其他设备(如Samsung)上测试过它,并且发现不会发生同样的错误。

我见过general complaint,蓝牙并没有在HTC Hero上正确实施。有一个完整的解决方案here