La conexión Bluetooth falló “java.io.IOException: error de lectura, el socket podría cerrarse o el tiempo de espera, read ret: -1”

Estoy tratando de conectar dispositivos a través de mi aplicación instalada en Nexus 5. Quiero hacer una aplicación como contactos arco iris en Android. En mi aplicación, bash conectarme a otro dispositivo a través de Bluetooth y transferir un conjunto de contactos o archivos. Seguí esta pregunta , pero la solución mencionada allí no funciona para mí Aquí está mi código completo. Este es el fragmento de código de mi aplicación donde he intentado obtener el socket y hacer las conexiones.

Puedo pasar el cuadro de diálogo del dispositivo de emparejamiento, pero cuando bash emparejarlo aparece un error

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

Error que estoy recibiendo

 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. 

Entonces, ¿qué estoy haciendo mal? Cualquier ayuda sería apreciada

En el constructor de BluetoothConnector.java , se pasa una lista de uuidCandidates .

 public BluetoothConnector(BluetoothDevice device, boolean secure, BluetoothAdapter adapter, List uuidCandidates) { this.device = device; this.secure = secure; this.adapter = adapter; this.uuidCandidates = uuidCandidates; if (this.uuidCandidates == null || this.uuidCandidates.isEmpty()) { this.uuidCandidates = new ArrayList(); this.uuidCandidates.add(UUID.fromString("fa87c0d0-afac-11de-8a39-0800200c9a66")); } } 

¿Lo has pasado nulo?

En caso afirmativo, intente llamar a device.fetchUuidsWithSdp() para el dispositivo Bluetooth que desea conectar y reciba BluetoothDevice.ACTION_UUID intención de BluetoothDevice.ACTION_UUID en su receptor. Como esto obtendrá una lista de los uuids compatibles con el dispositivo.

Dentro del try (“// try the fallback”) usa esto:

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

Otro consejo puede ser usar un UUID diferente, puede resolver el problema.


No sé si lo probaste aún, pero de manera similar a lo que se ha hecho en el ejemplo del chat bluetooth , justo antes de crear tu ConnectThread, llama a esta función:

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

Tengo esta cosa más extraña en el sistema Android 5.0 que podría tener que borrar la caché como se sugiere aquí: http://www.gottabemobile.com/2014/12/01/nexus-lollipop-problems-fixes/

y también es posible que deba desconectar el dongle bt para que no ocupe la conexión anterior en la memoria si usa una PC y un transmisor de dongle bt barato.

Caché sucio Busque dónde en el dispositivo para borrar el caché de la aplicación y luego reinicie el dispositivo. Puede tener un interruptor de control de flujo del dispositivo (firewall, muro de aplicaciones, software de seguridad) que intercepta el puerto y lo vuelve a emitir, este es el problema. Dependiendo de dónde crea la instancia en el inicio, ahora es diferente de lo que quiere tu aplicación. Por lo tanto, vuelva a generar la tabla haciendo una pausa en el caché y reiniciando para volver a generar las tablas de caché / redirección. Sé que esto suena perversamente efímero, pero funcionó para mí.