La conexión Bluetooth en Android ICS no es posible

Estoy escribiendo una aplicación que envía códigos de bytes de una tableta a un μ-controler. Todo funcionó bien en el Lenovo A1 (Androi 2.3) y Samsung Galaxy Tab 7 Plus N (Android 3.2). Ahora estoy teniendo problemas con el nuevo Samsung Galaxy Tab 2 (Android 4.0).

Puedo emparejar con la antena de Bluetooth (que se conecta al μ-regulador y comunica sobre el protocolo serial). Cuando inicio la aplicación, se me pide de nuevo que introduzca la contraseña y que se empareje. Después de ingresar la contraseña de emparejamiento mi diseño principal es visible, pero no se establece una conexión.

El LogCat en eclipse me dice:

06-19 16:00:20.656: V/BluetoothSocket.cpp(3189): availableNative 06-19 16:00:20.664: V/BluetoothSocket.cpp(3189): abortNative 06-19 16:00:20.664: V/BluetoothSocket.cpp(3189): ...asocket_abort(49) complete 06-19 16:00:20.664: I/ActivityManager(185): No longer want com.google.android.partnersetup (pid 3220): hidden #16 06-19 16:00:20.671: V/BluetoothSocket.cpp(3189): availableNative 06-19 16:00:20.671: V/BluetoothSocket.cpp(3189): destroyNative 06-19 16:00:20.671: V/BluetoothSocket.cpp(3189): ...asocket_destroy(49) complete 06-19 16:00:20.679: D/KeyguardViewMediator(185): setHidden false 06-19 16:00:20.679: W/System.err(3189): java.io.IOException: socket closed 06-19 16:00:20.679: W/System.err(3189): at android.bluetooth.BluetoothSocket.available(BluetoothSocket.java:370) 06-19 16:00:20.679: W/System.err(3189): at android.bluetooth.BluetoothInputStream.available(BluetoothInputStream.java:40) 06-19 16:00:20.679: W/System.err(3189): at java.io.BufferedInputStream.available(BufferedInputStream.java:114) 06-19 16:00:20.687: W/System.err(3189): at ebs.alphadidact.control.ReceiveThread.run(ReceiveThread.java:79) 

Además, el LogCat recibe mil veces el mensaje:

 V/BluetoothSocket.cpp(3189): availableNative 

Así que como busqué en la web he encontrado algunos chicos con un problema similar, pero no hay solución. ¿Alguien sabe algo sobre este tema?

Tal vez sea un problema de compacidad entre la antena y el android 4.0. No creo que el error está en mi código porque como he dicho el mismo código se está ejecutando en las versiones de Android más antiguo perfectamente.

Ok, descubrí cuál es el problema. No estoy seguro si es sólo un problema de Samsung o un problema de Android ICS.

Traté de conectarme a la antena como de costumbre usando (para obtener el Socket):

 clientSocket = device.createRfcommSocketToServiceRecord(MY_UUID); 

Bueno, parece que no funciona con mi antena y la configuración de la tableta, así que intenté:

 clientSocket = device.createInsecureRfcommSocketToServiceRecord(MY_UUID); 

Esto funciona. La primera opción forzó al sistema a desacoplar la antena y luego pedir que apareara nuevamente.

En realidad, crear un socket inseguro es lo mismo que conectar dos dispositivos no emparejados. Esto no es claramente la mejor manera de manejarlo.

He encontrado que Android trata de reparar el dispositivo, y luego rechaza la respuesta de emparejamiento. Después de este comportamiento bizzare, aceptará el intento de conexión siguiente!

También intenté el bugtracker de Android: Bluetooth RFCOMM Server Socket ya no se conecta correctamente al dispositivo incrustado en ICS 4.0.3 .

Aún esperando una respuesta…

Gracias a @fuentessifuentes respuesta escribí este método, incluyendo la compatibilidad hacia atrás:

 private BluetoothSocket createBluetoothSocket(BluetoothDevice device) throws IOException { if(Build.VERSION.SDK_INT >= 10){ try { final Method m = device.getClass().getMethod("createInsecureRfcommSocketToServiceRecord", new Class[] { UUID.class }); return (BluetoothSocket) m.invoke(device, SPP_UUID); } catch (Exception e) { Log.e(TAG, "Could not create Insecure RFComm Connection",e); } } return device.createRfcommSocketToServiceRecord(SPP_UUID); } 

Tal vez ayuda a alguien, fuera de este issu.

Creo que estoy viendo el mismo problema. Estoy usando una aplicación de terminal spp de Google play que funcionó perfectamente después de emparejar el dispositivo con mi stock droid x. Pero ahora con mi galaxia s3 con la misma aplicación y el mismo dispositivo me obliga a volver a emparejar cada vez.

Su solución es una especie de solución. Parece que Android cambió este comportamiento en ICS. Por lo tanto, la verdadera solución es que Google corrija ICS para permitir que los dispositivos spp se emparejen y se conecten sin tener que emparejar.

Pero, vi algún código para tratar un problema similar:

 BluetoothSocket mSocket = null; mBluetoothAdapter.cancelDiscovery(); Method method; try { method = mBluetoothDevice.getClass() .getMethod("createRfcommSocket", new Class[] { int.class}); mSocket = (BluetoothSocket) method.invoke(mBluetoothDevice,1); } catch (NoSuchMethodException e1) { e1.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } mSocket.connect(); 

Usando este código:

 BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address); mBluetoothAdapter.cancelDiscovery(); Method m; try { m = device.getClass().getMethod("createInsecureRfcommSocket", new Class[] { int.class }); btSocket = (BluetoothSocket) m.invoke(device, 1); } catch (SecurityException e1) { e1.printStackTrace(); } catch (NoSuchMethodException e1) { e1.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } 

Y añadiendo lo siguiente a nuestra aplicación Manifest trabajado

<uses-sdk android:minSdkVersion="13" android:targetSdkVersion="16"/>

  • ¿Cómo usar el perfil de PROXIMITY PROFILE, IMMEDIATE ALERT SERVICE y Find Me Profile en android 4.3 BLE?
  • Eliminación automática de dispositivos BLE en Android
  • Problemas de conexión Bluetooth con IntentService
  • ¿Cuál es la mejor manera de desarrollar una aplicación multi-móvil con soporte para bluetooth?
  • ¿Podría crear más de un canal RFCOMM por hora?
  • Dispositivo Android como receptor para el perfil A2DP
  • Conexión insegura de Android al bluetooth
  • Cómo programaticamente forzar el descubrimiento de servicios de baja energía de bluetooth en Android sin usar caché
  • Leer datos de dispositivos Bluetooth emparejados en Android
  • Comprobar si mi dispositivo es detectable en Android
  • Uso del selector de dispositivos Android Bluetooth
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.