android bluetooth galaxy-tab

No es posible la conexión Bluetooth en Android ICS



galaxy-tab (5)

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 galaxy s3 con la misma aplicación y el mismo dispositivo, necesito volver a emparejar todo el tiempo.

Su solución es una especie de solución. Parece que Android cambió este comportamiento en ICS. Entonces, la verdadera solución es que Google arregle ICS para permitir que los dispositivos spp se emparejen y se conecten sin emparejarse.

Pero, sí vi un código para abordar 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();

Estoy escribiendo una aplicación que envía códigos de bytes desde 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 Bluetooth (que está conectada al controlador μ y se comunica a través del protocolo serie). Cuando inicio la aplicación, se me pide nuevamente que ingrese la contraseña y que se sincronice. Después de ingresar la contraseña de emparejamiento, mi diseño principal está 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

Entonces, mientras buscaba en la web encontré algunos tipos con un problema similar pero sin solución. ¿Alguien sabe algo sobre este tema?

Tal vez es un problema de compatibilidad entre la antena y Android 4.0. No creo que el error esté en mi código porque, como dije, el mismo código se ejecuta perfectamente en versiones anteriores de Android.


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

Descubrí que Android intenta reparar el dispositivo y rechaza la respuesta de emparejamiento. ¡Después de este comportamiento bizarro, aceptará el siguiente intento de conexión!

También probé el rastreador de errores de Android: el zócalo del servidor RFCOMM Bluetooth ya no se conecta correctamente al dispositivo integrado en ICS 4.0.3 .

Aún esperando una respuesta...


Gracias a la respuesta de @fuentessifuentes escribí este método que incluye compatibilidad con versiones anteriores:

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 asunto.


Ok, descubrí cuál es el problema. No estoy seguro de si es solo 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 configuración de antena y tableta, así que probé:

clientSocket = device.createInsecureRfcommSocketToServiceRecord(MY_UUID);

Esto funciona La primera opción obligó al sistema a desvincular la antena y luego solicitar el emparejamiento nuevamente.


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 agregando lo siguiente a nuestra aplicación Manifiesto trabajado

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