Ошибка Bindlisten при запуске Accept Thread
Может кто-нибудь сказать мне, что это за проблема? Я пытаюсь получить свое приложение, чтобы начать Accept Thread
Однако эта ошибка продолжает происходить.
Кто-нибудь может помочь?
Я использую HTC Hero с Android 2.1.
ERROR/BluetoothChatService(9585): java.io.IOException: Bindlisten failed
android.bluetooth.BluetoothAdapter.listenUsingRfcommWithServiceRecord(BluetoothAdapter.java:749)
Согласно здесь
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
в качестве руководства и справочной информации для разработки следующего кода. Поэтому, как только Bluetooth будет включен, пользователь нажмет кнопку меню, после чего появятся три кнопки. Пользователь выбирает server
кнопка, если они хотят запустить Accept Thread и стать хозяином игры.
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)
2 ответа
Этот код не будет работать для HTC Hero. Я проверил его на других устройствах, таких как Samsung, и обнаружил, что такая же ошибка не возникает.
Я видел общую жалобу, что Bluetooth не был реализован с HTC Hero. Здесь доступно полное решение.