it-swarm.com.de

Bluetooth-Verbindung ist fehlgeschlagen "Java.io.IOException: Lesen fehlgeschlagen, Socket wurde möglicherweise geschlossen oder Zeitüberschreitung, read ret: -1"

Ich versuche, Geräte über meine in Nexus 5 installierte App anzuschließen. Ich möchte eine App wie Rainbow-Kontakte in Android erstellen. In meiner App möchte ich über Bluetooth eine Verbindung zu einem anderen Gerät herstellen und eine Reihe von Kontakten oder Dateien übertragen. Ich folgte dieser Frage , aber die dort erwähnte Problemumgehung funktioniert nicht für mich Hier ist mein vollständiger Code ... Dies ist der Code-Ausschnitt aus meiner Anwendung, in dem ich versucht habe, den Socket zu erhalten und Verbindungen herzustellen.

Ich kann das Pairing-Gerätedialogfeld durchlaufen, aber wenn ich versuche, ein Pairing durchzuführen, wird der Fehler ausgelöst.

//to create socket
if (secure) {
            bluetoothSocket = device.createRfcommSocketToServiceRecord(uuid);
        } else {
            bluetoothSocket = device.createInsecureRfcommSocketToServiceRecord(uuid);
        }
//connection establishment
try {

                bluetoothSocket.connect();
                success = true;
                break;
            } catch (IOException e) {
                //try the fallback
                try {
                    Class<?> clazz = tmp.getRemoteDevice().getClass();
                    Class<?>[] paramTypes = new Class<?>[] {Integer.TYPE};
                    Method m = clazz.getMethod("createRfcommSocket", paramTypes);
                    Object[] params = new Object[] {Integer.valueOf(1)};
                    bluetoothSocket  = (BluetoothSocket) m.invoke(tmp.getRemoteDevice(), params);
                    Thread.sleep(500);
                    bluetoothSocket.connect();
                    success = true;
                    break;
                } catch (FallbackException e1) {
                    Log.w("BT", "Could not initialize FallbackBluetoothSocket classes.", e);
                } catch (InterruptedException e1) {
                    Log.w("BT", e1.getMessage(), e1);
                } catch (IOException e1) {
                    Log.w("BT", "Fallback failed. Cancelling.", e1);
                }
            }

Fehler bekomme ich 

09-06 13:44:57.247  27860-27860/com.example.gauravdubey.myapplication I/BT﹕ Attempting to connect to Protocol: 00001101-0000-1000-8000-00805f9b34fb
09-06 13:44:57.247  27860-27860/com.example.gauravdubey.myapplication W/BluetoothAdapter﹕ getBluetoothService() called with no BluetoothManagerCallback
09-06 13:44:57.247  27860-27860/com.example.gauravdubey.myapplication D/BluetoothSocket﹕ connect(), SocketState: INIT, mPfd: {ParcelFileDescriptor: FileDescriptor[56]}
09-06 13:44:58.667  27860-27860/com.example.gauravdubey.myapplication W/BluetoothAdapter﹕ getBluetoothService() called with no BluetoothManagerCallback
09-06 13:44:58.667  27860-27860/com.example.gauravdubey.myapplication D/BluetoothSocket﹕ connect(), SocketState: INIT, mPfd: {ParcelFileDescriptor: FileDescriptor[59]}
09-06 13:45:03.267  27860-27860/com.example.gauravdubey.myapplication W/BT﹕ Fallback failed. Cancelling.
    Java.io.IOException: read failed, socket might closed or timeout, read ret: -1
            at Android.bluetooth.BluetoothSocket.readAll(BluetoothSocket.Java:505)
            at Android.bluetooth.BluetoothSocket.waitSocketSignal(BluetoothSocket.Java:482)
            at Android.bluetooth.BluetoothSocket.connect(BluetoothSocket.Java:324)
            at com.example.gauravdubey.myapplication.BluetoothConnector$FallbackBluetoothSocket.connect(BluetoothConnector.Java:198)
            at com.example.gauravdubey.myapplication.BluetoothConnector.connect(BluetoothConnector.Java:62)
            at com.example.gauravdubey.myapplication.ConnectThread.run(ConnectThread.Java:101)
            at com.example.gauravdubey.myapplication.MainActivity$1.onItemClick(MainActivity.Java:288)
            at Android.widget.AdapterView.performItemClick(AdapterView.Java:299)
            at Android.widget.AbsListView.performItemClick(AbsListView.Java:1113)
            at Android.widget.AbsListView$PerformClick.run(AbsListView.Java:2911)
            at Android.widget.AbsListView$3.run(AbsListView.Java:3645)
            at Android.os.Handler.handleCallback(Handler.Java:733)
            at Android.os.Handler.dispatchMessage(Handler.Java:95)
            at Android.os.Looper.loop(Looper.Java:136)
            at Android.app.ActivityThread.main(ActivityThread.Java:5001)
            at Java.lang.reflect.Method.invokeNative(Native Method)
            at Java.lang.reflect.Method.invoke(Method.Java:515)
            at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:785)
            at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:601)
            at dalvik.system.NativeStart.main(Native Method)
09-06 13:45:03.267  27860-27860/com.example.gauravdubey.myapplication V/connectThread﹕ Could not connect to device: B0:D0:9C:8B:A4:47
09-06 13:45:03.267  27860-27860/com.example.gauravdubey.myapplication I/Choreographer﹕ Skipped 361 frames!  The application may be doing too much work on its main thread.

Was mache ich falsch? Jede Hilfe wäre dankbar 

12
Java_begins

Im Konstruktor von BluetoothConnector.Java wird eine Liste von uuidCandidates übergeben.

public BluetoothConnector(BluetoothDevice device, boolean secure, BluetoothAdapter adapter,
                              List<UUID> uuidCandidates) 
          {
        this.device = device;
        this.secure = secure;
        this.adapter = adapter;
        this.uuidCandidates = uuidCandidates;

        if (this.uuidCandidates == null || this.uuidCandidates.isEmpty()) {
            this.uuidCandidates = new ArrayList<UUID>();
            this.uuidCandidates.add(UUID.fromString("fa87c0d0-afac-11de-8a39-0800200c9a66"));
        }
    }

Hast du es null übergeben?

Wenn ja, rufen Sie device.fetchUuidsWithSdp() für das Bluetooth-Gerät an, zu dem Sie eine Verbindung herstellen möchten, und empfangen Sie BluetoothDevice.ACTION_UUID in Ihrem Receiver. Dadurch wird eine Liste der für das Gerät unterstützten Uuids abgerufen.

4
twister_void

Schmutziger Cache. Suchen Sie nach dem Speicherort auf dem Gerät, um den App-Cache zu löschen, und starten Sie das Ding neu. Möglicherweise verfügen Sie über einen Unterbrechungsschalter für die Geräteflusskontrolle (Firewall, App-Wall, Sicherheitssoftware), der den Port abfängt und erneut ausgibt. Je nachdem, wo es beim Start instanziiert wird, unterscheidet es sich jetzt von den Anforderungen Ihrer App. Erstellen Sie daher die Tabelle neu, indem Sie den Cache snarfing und neu starten, um die Cache/Redirect-Tabellen wieder aufzubauen. Ich weiß, das hört sich böse an, aber es hat für mich funktioniert. 

0
WU9I

Verwenden Sie in der try ("// try the Fallback") Folgendes:

socket =(BluetoothSocket) device.getClass().getMethod("createRfcommSocket", new Class[] {int.class}).invoke(device,1);
socket.connect();

Ein anderer Tipp kann sein, eine andere UUID zu verwenden, um das Problem zu lösen.


Ich weiß nicht, ob Sie es noch nicht ausprobiert haben, aber ähnlich wie im bluetooth-Chat-Beispiel wurde kurz vor dem Erstellen Ihres ConnectThread diese Funktion aufgerufen:

public synchronized void connect(BluetoothDevice device) {

    // Cancel any thread attempting to make a connection
    if (mState == STATE_CONNECTING) {
        if (mConnectThread != null) {
            mConnectThread.cancel();
            mConnectThread = null;
        }
    }

    // Cancel any thread currently running a connection
    if (mConnectedThread != null) {
        mConnectedThread.cancel();
        mConnectedThread = null;
    }

    // Start the thread to connect with the given device
    mConnectThread = new ConnectThread(device);
    mConnectThread.start();
    setState(STATE_CONNECTING);
}
0
kalup

Ich habe diese seltsamste Sache auf dem Android 5.0-System. Möglicherweise müssen Sie den Cache löschen. __ wie hier vorgeschlagen: __. http://www.gottabemobile.com/2014/12/01/nexus-Lollipop-problems-fixes/

außerdem müssen Sie möglicherweise den bt-Dongle trennen, damit die vorherige Verbindung im Speicher nicht belegt wird, wenn Sie einen PC und einen billigen bt-Dongle-Sender verwenden 

0
sivi