Ошибка 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. Здесь доступно полное решение.

Другие вопросы по тегам