web-dev-qa-db-fra.com

Échec de la connexion Bluetooth "Java.io.IOException: échec de la lecture, socket peut-être fermé ou délai d'attente, lecture de la ret: -1"

J'essaie de connecter des appareils via mon application installée dans Nexus 5.Je souhaite créer une application telle que contacts Rainbow dans Android. Dans mon application, je souhaite connecter à un autre appareil via Bluetooth et transférer un ensemble de contacts ou de fichiers . J'ai suivi cette question , mais la solution de contournement mentionnée ici ne fonctionne pas pour moi Ici est mon code complet ..__ Ceci est l'extrait de code de mon application où j'ai essayé d'obtenir le socket et d'établir des connexions.

_ {Je parviens à passer à travers le dialogue d'appareil de couplage, mais lorsque j'essaie d'apparier, une erreur est générée}

//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);
                }
            }

Erreur je reçois 

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.

Alors qu'est-ce que je fais mal? Toute aide serait appréciée 

12
Java_begins

Dans le constructeur de BluetoothConnector.Java , une liste de uuidCandidates est transmise.

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"));
        }
    }

L'as-tu passé nul?

Si oui, essayez alors d'appeler device.fetchUuidsWithSdp() pour le périphérique Bluetooth que vous souhaitez connecter et recevez BluetoothDevice.ACTION_UUID intentionnel dans votre récepteur. Une liste des uuids pris en charge par ce périphérique sera également récupérée.

4
twister_void

Cache sale. Recherchez où, sur le périphérique, vider le cache de l'application, puis redémarrez. Vous pouvez avoir un interrupteur de contrôle de flux de périphérique (pare-feu, mur d'applications, logiciel de sécurité) qui intercepte le port et le réémet - c'est le problème. En fonction de l'endroit où elle s'installe au démarrage, c'est maintenant différent de ce que votre application veut. Par conséquent, reconstruisez la table en enregistrant le cache et en redémarrant pour reconstruire les tables cache/redirection. Je sais que cela semble terriblement éphémère, mais cela a fonctionné pour moi. 

0
WU9I

Dans try ("// try the fallback"), utilisez ceci:

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

Une autre astuce consiste peut-être à utiliser un UUID différent, cela peut résoudre le problème.


Je ne sais pas si vous l'avez déjà essayé, mais de la même manière que dans l'exemple de chat bluetooth , juste avant de créer votre ConnectThread, appelez cette fonction:

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

J'ai cette chose la plus étrange sur le système Android 5.0 que vous pourriez avoir à vider le cache Comme suggéré ici: http://www.gottabemobile.com/2014/12/01/nexus-Lollipop-problems-fixes/

et vous devrez peut-être également déconnecter le dongle bt pour qu’il n’occupe pas la connexion précédente en mémoire si vous utilisez un ordinateur et un émetteur bt pas cher 

0
sivi