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.
- Impresión Bluetooth y WIFI para Android
- Android 6 bluetooth
- Conexión Bluetooth entre Android y Lego Mindstorm NXT
- Accesorio Bluetooth y Android Open Accessory Protocol
- ¿Cómo reiniciar BluetoothLeScanner?
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.
- Desconecta un zócalo bluetooth en Android
- Android BluetoothSocket write falla en 4.2.2
- Aplicación de congelación de socket Android Bluetooth
- Enviar datos desde Arduino a la aplicación para Android mediante Bluetooth
- Principios básicos de la implementación del bluetooth android
- Android IRC Horas de oficina Pregunta Acerca de Android Bluetooth RSSI
- SetNeedBle de SettingsApi no funciona en API23
- Bluetooth descubrir / escanear código no funciona después de la actualización Android 6 en mi Nexus 5
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"/>
- Android Amazon S3 excepción: "La clave especificada no existe"
- Ronda sólo esquina superior de cardview