Может кто-нибудь сказать мне, что это за проблема?Я пытаюсь заставить мое приложение запустить 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
, если он хочет запустить поток подтверждения и стать хозяином игры.
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)