2012-06-18 18 views
6

Sto scrivendo un'app che invia codici byte da un tablet a un μ-controler. Tutto ha funzionato bene su Lenovo A1 (Androi 2.3) e Samsung Galaxy Tab 7 Plus N (Android 3.2). Ora sto avendo problemi con il nuovo Samsung Galaxy Tab 2 (Android 4.0).Connessione Bluetooth su ICS Android non possibile

Sono in grado di eseguire il pairing con l'antenna Bluetooth (che è collegata al controller μ e comunica tramite il protocollo seriale). Quando avvio l'app mi viene chiesto nuovamente di inserire la password e di accoppiare. Dopo aver inserito la password dell'associazione, il mio layout principale è visibile ma non viene stabilita una connessione.

Il LogCat in Eclipse mi 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) 

ulteriormente più è il LogCat riceve un migliaio di volte il messaggio:

V/BluetoothSocket.cpp(3189): availableNative 

Così come ho cercato nel web ho trovato un paio di ragazzi con un problema simile ma nessuna soluzione. Qualcuno sa qualcosa su questo problema?

Forse è un problema di compatibilità tra l'antenna e Android 4.0. Non penso che l'errore sia nel mio codice perché come ho detto lo stesso codice è in esecuzione su versioni Android precedenti perfettamente.

+0

hai risolto? – PankajAndroid

risposta

4

Ok, ho scoperto qual è il problema. Non sono sicuro che si tratti solo di un problema con Samsung o di un problema con Android ICS.

ho provato a collegare all'antenna come di consueto utilizzando (per ottenere il Socket):

clientSocket = device.createRfcommSocketToServiceRecord(MY_UUID); 

Beh, sembra che non funziona con la mia antenna e la configurazione Tablet, così ho provato:

clientSocket = device.createInsecureRfcommSocketToServiceRecord(MY_UUID); 

Questo funziona. La prima opzione ha costretto il sistema a disaccoppiare l'antenna e in seguito chiedere nuovamente l'associazione.

+0

Wow, questo mi ha aiutato! Grazie! – Jaykob

2

La creazione di una presa non sicura è la stessa della connessione di due dispositivi non accoppiati. Questo non è chiaramente il modo migliore per gestirlo.

Ho riscontrato che Android tenta di riparare il dispositivo e quindi rifiuta la risposta di accoppiamento. Dopo questo comportamento bizzarro, accetterà il prossimo tentativo di connessione!

Ho anche provato il bugtracker Android: Bluetooth RFCOMM Server Socket no longer connects properly to embedded device on ICS 4.0.3.

Ancora in attesa di una risposta ...

1

credo che sto vedendo lo stesso problema. Sto usando un'app terminale spp da Google Play che ha funzionato perfettamente dopo l'associazione del dispositivo con il mio stock droid x. Ma ora con la mia galassia s3 con la stessa app e lo stesso dispositivo mi richiede di ri-accoppiare ogni volta.

La soluzione è una specie di soluzione alternativa. Sembra che Android abbia modificato questo comportamento in ICS. Quindi la vera soluzione è che Google aggiusti ICS per consentire ai dispositivi spp di accoppiarsi e connettersi senza essere abbinati.

Ma, ho visto un po 'di codice per risolvere un problema simile:

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

è possibile modificare la propria risposta per includere eventuali aggiunte desiderate. Basta fare clic sul piccolo link "modifica" sopra (in basso a sinistra della risposta). – davidcesarino

0

utilizzando questo codice:

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

e aggiungendo il seguente al nostro file manifest lavorato

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

2

Grazie alla risposta @fuentessifuentes ho scritto questo metodo includi ng retrocompatibilità:

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

Forse aiuta somone, fuori da questo problema.