Autore Topic: Attendere l'evento GPS_EVENT_FIRST_FIX  (Letto 1173 volte)

Offline pier_IP

  • Nuovo arrivato
  • *
  • Post: 2
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung GT-S5300
  • Sistema operativo:
    Linux Mint 13 "Maya" mate
Attendere l'evento GPS_EVENT_FIRST_FIX
« il: 04 Agosto 2012, 12:30:23 CEST »
0
Ciao a tutti, sono nuovo di questo forum.
Ho da porvi un quesito che mi tiene impegnato da un paio di giorni (~ 10/24 h)

Sto sviluppando un'applicazione che deve stampare ogni 60 secondi le coordinate del gps, la stampa deve avvenire sse e' possibile ottenere i dati.
Per adesso il primo scoglio e' il GPS_EVENT_FIRST_FIX cioe' devo cominciare a stampare quando c'e' stato il primo fix dei satelliti.
L'applicazione deve mettersi in pausa fin quando non avviene l'evento GpsStatus.GPS_EVENT_FIRST_FIX, magari visualizzando una ProgressBarDialog. Come fare per metterla in pausa?
Ho provato con un InputStream e un OutputStream
Codice (Java): [Seleziona]
public class GPS{
        public GPS(Context context){
               
                location = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
               
                if ( location.isProviderEnabled(LocationManager.GPS_PROVIDER) ) {
                        startGpsTracking();
                }
        }
       
       
        private void startGpsTracking() {
                //aggiungo un ascoltatore sul gpsstatus
                location.addGpsStatusListener(gpsListener);
               

                location.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000 , 5, myLocListener);
               
                Log.d("tag", "Terminato startGpsTracking");
                try {
                       
                        isItFix = new PipedInputStream((PipedOutputStream) yesItIsFix);
                        Log.d("tag", "GPS : isItFix inizializzato");
                       
                        isItFix.read();
                       
                        Log.d("tag", "GPS.startGpsTracking() : isItFix ha letto l'output di yesItIsFix");
                        //quando arrivo qui vuol dire che e' stato preso il primo fix gps
                       
                } catch (IOException e) {
                        Log.d("tag", e.getMessage());
                        e.printStackTrace();
                }
        }



        private Listener gpsListener= new Listener () {
               
                @Override
                public void onGpsStatusChanged(int status) {
                        switch (status) {
                       
                                case GpsStatus.GPS_EVENT_FIRST_FIX:
                                        Log.d("tag", "onGpsStatusChanged : FirstFix,  primi valori di coordinate ricevuto");
                                        try {
                                                //scrivo qualcosa per svegliare startGpsTracking
                                                yesItIsFix.write(1);
                                               
                                                //mi chiudo subito
                                                yesItIsFix.close();
                                               
                                        } catch (IOException e) {
                                                Log.d("tag", e.getMessage());
                                                e.printStackTrace();
                                        }
                                        break;
                               
                                case GpsStatus.GPS_EVENT_SATELLITE_STATUS:
                                        Log.d("tag", "onGpsStatusChanged : Satellite,  stato dei satelliti cambiato");
                                        break;
                               
                                case GpsStatus.GPS_EVENT_STARTED:
                                        Log.d("tag", "onGpsStatusChanged : Started,  GPS System avviato");
                                        break;
                               
                                case GpsStatus.GPS_EVENT_STOPPED:
                                        Log.d("tag", "onGpsStatusChanged : Stopped,   GPS System fermato");
                                        break;
                        }
                }
        };


}


Questo codice ovviamente non funziona, concettualmente credo sia corretto ma l'aggiunta del listener location.addGpsStatusListener(gpsListener); sembra non avvenire (anche se ritorna true), infatti si blocca tutto e il listener non cattura l'evento.

Se invece non mi metto in pausa con l'InputStream il listener viene aggiunto correttamente. Ho pensato che visto che la read() interrompe il thread, magari anche il listener si mette in pausa quindi non verra' mai trasmesso nulla sullo stream, ma anche facendo partire un thread separato per l'aggiunta o la creazione del listener si blocca lo stesso.

Prima di questa soluzione non funzionante ne ho provata un'altra (altrettanto non funzionante) meno "elegante" e piu' brutale: variabile booleana isFix che viene settata a true all'evento GpsStatus.GPS_EVENT_FIRST_FIX con un while(true) in startGpsTracking() invece della read che controlla ogni secondo ( con Thread.sleep(1000) ) la variabile isFix. Risultato lo stesso: blocco dell'applicazione e listener che non risponde.

Sto disperatamente googlando alla ricerca di una soluzione, ma senza successo...
« Ultima modifica: 04 Agosto 2012, 12:54:08 CEST da pier_IP »

Offline lucab

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: +10
    • Mostra profilo
    • Lucabportal
  • Dispositivo Android:
    Nexus 5 - Nexus One
  • Play Store ID:
    Luca Biasotto
  • Sistema operativo:
    Mac OS X
Re:Attendere l'evento GPS_EVENT_FIRST_FIX
« Risposta #1 il: 06 Agosto 2012, 13:44:24 CEST »
0
Hai già provato a guardare qui?
http://www.anddev.it/index.php/topic,15.0.html
questo tutorial è fatto molto bene!

Se ho capito il tuo problema io farei così:
nell' onLocationChanged stamperei le coordinate aggiornate, mentre nell' onStatusChanged mostrerei o meno un ProgresDialog.

P.s. l'evento onLocationChanged non scatta se non c'è segnale, e se vuoi aggiornare solo ogni 60 sec, potresti semplicemente usare System.currentTimeMillis e stampare solo se sono passati 60 secondi dal precedente.

Se ti può servire per gestire le progresDialog ho trovato molto utile questo tutorial, ti spiega come fare svariati tipi di dialog, credo che a te basti una Progress dialog semplice con un messaggio del tipo "ricerca segnale" e la rottellina che ruota.

http://www.anddev.it/index.php?topic=3305.0

Spero di esserti stato utile! ;)
Le occasioni arrivano una volta sola, se non le afferri al volo passeranno altri alla storia.

Offline pier_IP

  • Nuovo arrivato
  • *
  • Post: 2
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung GT-S5300
  • Sistema operativo:
    Linux Mint 13 "Maya" mate
Re:Attendere l'evento GPS_EVENT_FIRST_FIX
« Risposta #2 il: 06 Agosto 2012, 20:08:46 CEST »
0
Ciao, grazie della risposta!
Si mi studiai quel tutorial tempo fa, mi e' servito appunto per capire il funzionamento base di GpsStatus e del LocationManager.
Comunque alla fine ho risolto separando la realizzazione della ProgressDialog da tutto il resto.
Detto rapidamente ho usato lo scambio di messaggi tra thread insieme alla "sveglia" con la PipedOutputStream.
Ora devo riorganizzare il codice per renderlo piu' manutenibile dopodiché pubblichero' tutta la struttura in modo dettagliato, tanto comunque devo scrivere la documentazione di questo progetto e avendo una "mentalita' open-source" la rendero' disponibile a tutti.

Offline lucab

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: +10
    • Mostra profilo
    • Lucabportal
  • Dispositivo Android:
    Nexus 5 - Nexus One
  • Play Store ID:
    Luca Biasotto
  • Sistema operativo:
    Mac OS X
Re:Attendere l'evento GPS_EVENT_FIRST_FIX
« Risposta #3 il: 06 Agosto 2012, 20:48:39 CEST »
0
Ti è servito a poco il mio consiglio insomma ahah :)

Va beh l'importante è che hai risolto!!  8-)
Le occasioni arrivano una volta sola, se non le afferri al volo passeranno altri alla storia.