2013-03-22 19 views
5

Ho lavorato per rendere la connessione USB specificata nel collegamento here e l'abbiamo implementata con successo. Funziona bene e accetta che spesso si stacchi. Ho saputo dal link this e this che c'è un bug nel sistema operativo Android che non c'è nessun evento di trasmissione dell'evento di connessione USB. Ho implementato un ricevitore per ottenere eventi di disconnessione USB che non è troppo importante. Inoltre, faccio riferimento al collegamento this per creare una connessione stabile con USB, ovvero avviare la comunicazione dei dati dopo la connessione USB senza alcuna perdita. Tutta questa cosa funziona bene quando c'è una singola attività o una singola schermata nell'applicazione.Problema di connessione AOA USB

Per lo schermo multiplo questa connessione ha problemi, ovvero la connessione non è stabile e ho più schermi in applicazione in cui posso ricevere dati via USB in qualsiasi attività in qualsiasi momento. Così ho 2 problema che sto cercando risposte su con un po 'di codice, se possibile

  1. Come posso fare il collegamento stabile con il dispositivo collegato tramite USB di serie in Android su più schermi
  2. Come sbarazzarsi di questa frequente disconnessione problema nella applicazione su schermi multipli

Qualsiasi aiuto sarebbe grato

EDIT:

Sto aggiungendo il mio servizio, che è responsabile per la comunicazione con USB e avvia un thread per i dati di ricezione continui

import java.io.IOException; 
import java.util.ArrayList; 
import java.util.Arrays; 

import android.app.AlertDialog; 
import android.app.Service; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.DialogInterface.OnClickListener; 
import android.content.Intent; 
import android.hardware.usb.UsbManager; 
import android.os.IBinder; 
import arya.omnitalk.com.usb.R; 
import arya.omnitalk.com.usb.constants.FileReadingWritingConstants; 
import arya.omnitalk.com.usb.constants.GeneralConstant; 
import arya.omnitalk.com.usb.constants.UsbDataWriterConstants; 

import com.hoho.android.usbserial.driver.UsbSerialProber; 

public class UsbCommunicationService extends Service{ 

    public static ArrayList<String> _dataArray = new ArrayList<String>(); 
    private Thread mCommunicationThread = null; 

    private class ReadThread implements Runnable { 
     @Override 
     public void run() { 

      while (mCommunicationThread!= null && !mCommunicationThread.isInterrupted()) { 

       // Here I write code to parse data received via USB 

       }   
     } 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 

     UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE); // Creating object of usb manager 
     UsbDataWriterConstants.driver = UsbSerialProber.acquire(manager); // Acquiring usb channel 

     if (UsbDataWriterConstants.driver != null) { 
      try { 
       UsbDataWriterConstants.driver.open(); 
      } catch (IOException e1) { 
       e1.printStackTrace(); 
      } 

      try { 
       ReadThread mReadThread = new ReadThread(); 
       mCommunicationThread = new Thread(mReadThread); 
       mCommunicationThread.start(); 
      } catch (SecurityException e) { 
       DisplayError(R.string.error_security); 
       DisplayError(R.string.error_security); 
      } 
     } 

    } 

    @Override 
    public void onStart(Intent intent, int startId) { 
     super.onStart(intent, startId); 

    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    @Override 
    public void onDestroy() { 
     if (mCommunicationThread != null) 
      mCommunicationThread.interrupt(); 
     super.onDestroy(); 
    } 


} 
+0

Si potrebbe andare in giro in modi diversi. Ti suggerisco di creare un servizio che gestisca la connessione USB e che le tue attività comunichino con USB tramite il tuo servizio. – Luis

+0

@Leco Attualmente sto facendo quella cosa ma non appena usb connesso di nuovo crea di nuovo istanza e non ricevo dati perché sto mantenendo la vecchia istanza –

+0

Senza vedere il tuo codice per capire la logica dell'applicazione, una cosa che mi viene in mente è che puoi rendere launchMode dell'attività che non vuoi rinominare "singleTask" nel file manifest (android: launchMode = "singleTask" sotto il tag attività). Vedere https://developer.android.com/guide/topics/manifest/activity-element.html#lmode – Luis

risposta

0

Probabilmente avete deconnections perché il servizio è solo un servizio legato. La prima attività inizia, si collega al servizio, che verrà quindi avviato. Quando si passa a un'altra attività, la prima viene arrestata, quindi si disattiva. A questo punto, il servizio non è più legato, quindi viene ucciso. I servizi associati sono spiegati qui: http://developer.android.com/guide/components/bound-services.html

Ciò che è necessario è probabilmente per mantenere il servizio in esecuzione fino a quando USB è collegato. A tal fine, è necessario un servizio "permanente", un iniziato uno, come descritto di seguito: http://developer.android.com/guide/components/services.html È possibile avviare il servizio nel onCreate dell'attività che ha ricevuto l'evento collegato, l'uso:

public class HomeActivity extends Activity { 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      // ... 
      Intent intent = new Intent(this, UsbCommunicationService.class); 
      startService(intent); 
      // ... 
     } 
    } 

Il UsbCommunicationService sarà avviato tramite questo metodo (onStart() è sconsigliata):

public class UsbCommunicationService extends Service { 
     @Override 
     public int onStartCommand(Intent intent, int flags, int startId) { 

      // TODO : connect to USB... 

      // We want this service to continue running until it is explicitly 
      // stopped, so return sticky.  
      return START_STICKY; 
     } 
    } 

Successivamente, tutte le vostre attività può "legare", "unbind" e "associare nuovamente" per questo servizio che sopravviverà. Non dimenticare di fermarlo in caso di evento DISCONNECT, utilizzando:

 stopSelf(); // Will actually stop AFTER all clients unbind... 

se ha aiutato, vi prego di accettare il mio anwser/votare fino :)

+0

si prega di controllare il mio codice di servizio. Sto facendo esattamente quello che stai mostrando qui. non aiuta –

+0

Si utilizza onStart (Intent intent, int startId) invece di onStartCommand (...). Quindi non puoi restituire START_STICKY e il tuo servizio potrebbe non essere un servizio "avviato" + "vincolato" che sopravvive ... Inoltre, per essere sicuro di non essere ucciso, il tuo servizio deve richiedere in primo piano aggiungendo una notifica alla barra di stato. – Bonrry

+0

Su quella nota posso dire che il mio servizio è in esecuzione in qualsiasi momento. in secondo luogo sto fermando e avviando il servizio quando è necessario e il mio servizio si avvia e si interrompe quando l'evento viene fornito così non c'è nessun problema relativo al servizio non avviato o ucciso –

0

Ecco il codice della mia attività beeing registrato per il mio Accessorio USB.

public class UsbAccessoryAttachedWorkaroundActivity extends Activity { 

    /** 
    * Used only to catch the USB_ACCESSORY_ATTACHED event, has it is not broadcasted to 
    * anything else than the activity with the right accessory_filter (no Service, nor Receiver...) 
    * DETACHED event is broadcasted as other events. 
    */ 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      Intent intent = new Intent(this, UsbService.class); 
      startService(intent); 
      finish(); // <- die ASAP, without displaying anything. 
    } 
    } 

In questo modo si ottiene tutto Connect Events in quanto l'attività non è ancora in vita => Android rilanciarlo ogni accessorio volta che viene scoperto ... Il mio servizio avvia la mia HomeActivity solo se nessuno vi è collegato. Se qualcuno è legato, vuol dire che è già presente un'interfaccia utente, quindi devo solo avvisare i miei ascoltatori che la connessione USB è tornata ...

+0

Grazie per il codice Bonrry ma c'è ancora una restrizione Non posso rilanciare la stessa attività e devo fare questo genere di cose in sfondo su alcune attività diverse :). Questo è quello che ho da dire nelle mie domande –

Problemi correlati