2012-06-18 20 views
6

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).Conexión Bluetooth en Android ICS no es posible

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) 

Adicionalmente es el LogCat recibir mil veces el mensaje:

V/BluetoothSocket.cpp(3189): availableNative 

Así que busqué en la web me encontré con un par de tipos con un problema similar pero sin solución. ¿Alguien sabe algo sobre este tema?

Tal vez sea 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.

+0

ha resuelto esto? – PankajAndroid

Respuesta

4

Bien, descubrí cuál es el problema. No estoy seguro de si es solo un problema de Samsung o un problema de Android ICS.

intenté conectar a la antena como de costumbre utilizando (para obtener el zócalo):

clientSocket = device.createRfcommSocketToServiceRecord(MY_UUID); 

Pues 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 obligó al sistema a desvincular la antena y luego solicitar el emparejamiento nuevamente.

+0

¡Guau, esto me ayudó! ¡Gracias! – Jaykob

2

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

He encontrado que Android intenta reparar el dispositivo, y luego 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: Bluetooth RFCOMM Server Socket no longer connects properly to embedded device on ICS 4.0.3.

A la espera de una respuesta ...

1

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, yo he visto algo de código para hacer frente a 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(); 
+0

puede editar su propia respuesta para incluir las adiciones que desee. Simplemente haga clic en el pequeño enlace "editar" arriba (abajo a la izquierda de la respuesta). – davidcesarino

0

Utilizando 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 Manifiesto trabajado

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

2

Gracias a @fuentessifuentes respuesta escribí este método includi ng 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); 
} 

Quizás esto ayude a alguien, fuera de este tema.

Cuestiones relacionadas