2013-03-22 14 views
5

Ich habe daran gearbeitet, USB-Verbindung in der Verbindung here spezifiziert und erfolgreich implementiert. Es funktioniert gut akzeptieren, es wird häufig getrennt. Ich erfuhr von this Link und this Link, dass es ein Fehler in Android OS ist, dass es keine Broadcast-Ereignis von USB-Verbindungsereignis ist. Ich habe einen Empfänger für USB-Trennereignis implementiert, das nicht zu wichtig ist. Auch ich verweise this Link, um stabile Verbindung mit USB zu schaffen, d. H. Datenkommunikation nach USB-Verbindung ohne Verlust zu starten. Diese ganze Sache funktioniert gut, wenn es eine einzelne Aktivität oder einen einzigen Bildschirm in der Anwendung gibt.AOA USB-Verbindungsproblem

Für mehrere Bildschirm diese Verbindung hat Problem, d. H. Verbindung ist nicht stabil und ich habe mehrere Bildschirm in Anwendung, in denen ich Daten über USB in jeder Aktivität zu jeder Zeit erhalten kann. Also ich habe 2 Fragen, die ich suche mich Antworten mit einigem Code, wenn möglich

  1. Wie kann ich eine stabile Verbindung mit Gerät über eine serielle USB in android über mehrere Bildschirme
  2. angebracht machen Wie diese häufigen Trennung loszuwerden

    01: Problem bei der Anwendung über mehrere Bildschirme

Jede Hilfe wäre

EDIT greatful sein

ich meinen Dienstes bin Zugabe, die für die Kommunikation mit usb verantwortlich ist und startet einen Thread für die kontinuierlichen Empfangsdatum

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

Sie könnten ein paar verschiedene Wege gehen. Ich würde vorschlagen, dass Sie einen Dienst erstellen, der die USB-Verbindung verarbeitet und Ihre Aktivitäten über Ihren Dienst mit USB kommunizieren lässt. – Luis

+0

@Leco Ich mache gerade dieses Ding, aber sobald USB wieder verbunden ist, erstellt es Instanz wieder und ich bekomme keine Daten als, weil ich alte Instanz halte –

+0

Ohne Ihren Code zu sehen, um Anwendungslogik zu verstehen, eine Sache, die in den Sinn kommt Sie können den LaunchMode der Aktivität, die nicht "singleTask" in der Manifestdatei wiederhergestellt werden soll (android: launchMode = "singleTask" unter dem Aktivitäts-Tag). Siehe https://developer.android.com/guide/topics/manifest/activity-element.html#lmode – Luis

Antwort

0

Sie wahrscheinlich deconnections haben, weil Sie da nur ein gebundener Service. Die erste Aktivität beginnt, binden Sie an den Dienst, der dann gestartet wird. Wenn Sie zu einer anderen Aktivität wechseln, wird die erste angehalten, sodass die Bindung aufgehoben wird. Zu diesem Zeitpunkt ist der Dienst nicht mehr gebunden und wird getötet. Gebundene Dienste werden hier erklärt: http://developer.android.com/guide/components/bound-services.html

Was Sie brauchen, ist wahrscheinlich, den Dienst so lange zu betreiben, wie USB angeschlossen ist. Um das zu erreichen, müssen Sie eine „persistent“ Service, begann man, wie hier beschrieben: http://developer.android.com/guide/components/services.html Sie können Ihren Dienst in der onCreate der Aktivität starten, der den CONNECTED-Ereignis empfangen, mit:

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

Die UsbCommunicationService wird mit dieser Methode gestartet werden (onStart() ist veraltet):

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

Als nächstes werden alle Ihre Aktivitäten können „binden“, „unbind“ und „rebind“ zu diesem Dienst, der überleben wird. Vergessen Sie nicht, es auf DISCONNECT Ereignis zu stoppen, mit:

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

Wenn es half bitte meine anwser/Abstimmung akzeptieren up :)

+0

Bitte überprüfen Sie meine Service-Code. Ich mache genau das, was Sie hier zeigen. es hilft nicht –

+0

Sie verwenden onStart (intent int, int startId) anstelle von onStartCommand (...). Daher können Sie START_STICKY nicht zurückgeben, und Ihr Dienst ist möglicherweise kein "gestarteter" + "gebundener" Dienst. Um nicht getötet zu werden, muss Ihr Dienst den Vordergrund anfordern, indem Sie der Statusleiste eine Benachrichtigung hinzufügen. – Bonrry

+0

In diesem Sinne kann ich sagen, dass mein Dienst die ganze Zeit läuft. Zweitens stoppe ich und beginne den Service, wann immer es notwendig ist, und mein Service wird gestartet und gestoppt, wenn das Ereignis zur Verfügung gestellt wird, so dass kein Problem im Zusammenhang mit dem Service aufgetreten ist. –

0

Hier ist der Code meiner Tätigkeit für registrierte beeing meine USB-Zubehör.

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

Auf diese Weise bekommen Sie alle CONNECT Ereignisse wie die Aktivität nicht noch am Leben ist => Android es wiederzubeleben jedes Zubehör Mal entdeckt wird ... Mein Dienst startet meine HomeActivity nur, wenn niemand daran gebunden ist. Wenn jemand gebunden ist, bedeutet dies, dass eine Benutzerschnittstelle bereits vorhanden ist, also benachrichtige ich meine Zuhörer, dass die USB-Verbindung zurück ist ...

+0

Vielen Dank für den Code Bonrry, aber es gibt eine weitere Einschränkung Ich kann nicht die gleiche Aktivität neu starten und ich muss diese Art von Sachen tun Hintergrund zu einer anderen Aktivität :). Das möchte ich in meinen Fragen sagen –