IOException on accept thread

Ein Teil meiner Anwendung stellt über Bluetooth eine Verbindung zu einem Gerät her und funktioniert normalerweise einwandfrei. Gelegentlich wird jedoch keine Verbindung hergestellt, und es wird die folgende Fehlermeldung angezeigt

03-11 10:29:20.328: E/BluetoothComService(8059): accept() failed
03-11 10:29:20.328: E/BluetoothComService(8059): java.io.IOException: Operation Canceled
03-11 10:29:20.328: E/BluetoothComService(8059):    at android.bluetooth.BluetoothSocket.acceptNative(Native Method)
03-11 10:29:20.328: E/BluetoothComService(8059):    at android.bluetooth.BluetoothSocket.accept(BluetoothSocket.java:316)
03-11 10:29:20.328: E/BluetoothComService(8059):    at android.bluetooth.BluetoothServerSocket.accept(BluetoothServerSocket.java:105)
03-11 10:29:20.328: E/BluetoothComService(8059):    at android.bluetooth.BluetoothServerSocket.accept(BluetoothServerSocket.java:91)
03-11 10:29:20.328: E/BluetoothComService(8059):    at com.mypackage.name.bluetooth.BluetoothService$AcceptThread.run(BluetoothService.java:298)

Dies ist die Zeile, in der ich die Ausnahme erhalte

socket = mmServerSocket.accept();    

Und das ist der komplette AcceptThread

private class AcceptThread extends Thread {
    // The local server socket
    private BluetoothServerSocket mmServerSocket;
    public boolean successInit = false;

    public AcceptThread() {
        closeAllConnections();

        /*
         * if(mmServerSocket != null) { try { mmServerSocket.close(); } catch
         * (IOException e) { e.printStackTrace(); } }
         */
        BluetoothServerSocket tmp = null;

        // Create a new listening server socket
        while (!successInit) {
            try {
                tmp = mAdapter
                        .listenUsingRfcommWithServiceRecord(NAME, MY_UUID);

                successInit = true;
            } catch (Exception e) {

                successInit = false;
            }
        }

        /*
         * try { tmp = mAdapter.listenUsingRfcommWithServiceRecord(NAME,
         * MY_UUID); successInit= true; } catch (IOException e) { Log.e(TAG,
         * "listen() failed", e); tmp = null; successInit = false; }
         */
        mmServerSocket = tmp;
    }

    public void run() {
        if (D)
            Log.d(TAG, "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
                mAdapter.cancelDiscovery();

                socket = mmServerSocket.accept();
            } catch (IOException e) {
                Log.e(TAG, "accept() failed", e);
                Log.e("Error", "This isn't connecting");
                break;
            }

            // If a connection was accepted
            if (socket != null) {
                synchronized (BluetoothService.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");
    }

    public void cancel() {
        if (D)
            Log.d(TAG, "cancel " + this);
        try {
            mmServerSocket.close();
        } catch (IOException e) {
            Log.e(TAG, "close() of server failed", e);
        }
    }
}     

Hier ist die Funktion, die ich am Anfang von aufrufeAcceptThread in der Hoffnung, alles zu schließen, um es neu zu starten

public void closeAllConnections() {
    if (mmInStream != null) {
        try {mmInStream.close();}
        catch  (Exception e){Log.e(TAG, "close() of connect socket failed", e);}
    }
    if (mmOutStream != null) {
        try {mmOutStream.close();}
        catch (Exception e){Log.e(TAG, "close() of connect socket failed", e);}
    }
    if (mmSocket != null) {
        try {
            mmSocket.close();
            //mmSocket.connect();
        }
        catch (IOException e) {
            Log.e(TAG, "close() of connect socket failed", e);
        }
    }
}

Ich habe das durchgelesenBluetooth-Dokumente und SO Fragen, aber ich habe nichts gefunden, das für mich funktioniert, und es wird für mich etwas verwirrend, da ich zum ersten Mal über BT eine Verbindung herstelle.

Hinweis

Das einzige "Update", das ich in diesem Fall gefunden habe, ist das Ausschalten des BT-Adapters, das erzwingen des Schließens des Programms, das Neustarten des BT-Adapters und das Neustarten der App, was aus offensichtlichen Gründen nicht gut ist. Ich habe versucht, den Adapter programmgesteuert neu zu starten, kann aber immer noch keine Verbindung herstellen.

Kann jemand sehen, was in meiner BlutoothService-Klasse möglicherweise nicht stimmt, woAcceptThread befindet sich? Oder wie würde ich vorgehen, um dieses Problem zu lösen? Vielen Dank!

Aktualisieren

Tatsächlich scheint die Verbindung manchmal geschlossen zu seinThread und versuchen, auf einem anderen wieder zu verbinden. Das Problem ist, dass ich nicht herausfinden kann, was dazu führen würde, dass versucht wird, eine separate Verbindung herzustellenThread oder wie man es repariert, wenn dies passiert.

Die einzige Möglichkeit, dies erfolgreich zu reproduzieren, besteht darin, dass ich den BT-Adapter ausschalte, wenn mein BT-Gerät ausgeschaltet ist. Wenn ich alles wieder einschalte, erhalte ich die Ausnahme und kann keine Verbindung herstellen. Ich habe zufällig und regelmäßig zufällige Kunden, also hoffe ich, dass die Probleme zusammenhängen.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage