Can anyone tell me what this problem is? I'm trying to get my application to start an Accept Thread
, however this error keeps occurring.
Can anyone help?
I'm using HTC Hero with Android 2.1.
ERROR/BluetoothChatService(9585): java.io.IOException: Bindlisten failed
android.bluetooth.BluetoothAdapter.listenUsingRfcommWithServiceRecord(BluetoothAdapter.java:749)
According to here
public BluetoothServerSocket listenUsingRfcommWithServiceRecord (String name, UUID uuid)
Throws IOException on error, for example Bluetooth not available, or insufficient permissions, or channel in use.
Some code here:
I have used BluetoothChat.java
as a guidance and reference for developing the following code. So once Bluetooth has been enabled, the user will pressed the menu button, three buttons will then appear. The user selects server
button if they want to start the Accept Thread and become the host of the game.
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;
}
Once the user selects the Server
button, it will call the following method from another class:
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();
}
}
And then this is the Accept Thread
. Using Debugger, I can confirm that the Accept Thread
is executed. However it fails at the first try catch
, it never executes this
tmp = mAdapter.listenUsingRfcommWithServiceRecord(NAME,MY_UUID);
Accept thread below:
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: ");
}
I just did some debugging, and the following errors occurred in the Accept Thread
. At the socket = mmServerSocket.accept();
line.
[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)
This code will not work for the HTC Hero. I have tested it on other devices like Samsung, and found that the same error does not occur.