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
- Come posso fare il collegamento stabile con il dispositivo collegato tramite USB di serie in Android su più schermi
- 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();
}
}
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
@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 –
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