Autore Topic: Funzionamento gps in android  (Letto 1710 volte)

Offline MrKrabs

  • Utente junior
  • **
  • Post: 94
  • Respect: +4
    • Mostra profilo
Funzionamento gps in android
« il: 08 Febbraio 2011, 22:52:59 CET »
0
ho prelevato un topic in un'altra discussione
Citazione
quando tu crei un listener e gli "dici di ascoltare il GPS" con requestLocationUpdate(), esso resterà in ascolto delle notifiche del sensore GPS e automaticamente ti avviserà di cambiamenti nella location riscontrata dal sensore, attraverso il metodo onLocationChanged(). Questa chiamata viene effettuata dal sistema, è intrinseca nell'essenza del Listener: quando "sente" qualcosa, avvisa.
Quindi funziona così:
- creazione listener
- iscrizione listener al GPS
- da ora in poi quando il GPS rileva un cambiamento di località, il listener sarà avvisato e aggiornerà i valori di latitude e longitude che hai messo tu nel listener.
Citazione
più il listener resta acceso, più consuma batteria

Quindi a proposito di quanto detto la mia domanda è questa:
quanto tempo rimane in "ascolto" il listener una volta che ho chiuso la mia applicazione che lo ha avviato?

grazie

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Funzionamento gps in android
« Risposta #1 il: 09 Febbraio 2011, 00:08:26 CET »
0
credo finchè non muore il processo ad esso associato...
ecco perchè devi deregistrare il listener nella fase di onPause o onStop (dipende se vuoi che rimanga in ascolto in background)
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline MrKrabs

  • Utente junior
  • **
  • Post: 94
  • Respect: +4
    • Mostra profilo
Re:Funzionamento gps in android
« Risposta #2 il: 09 Febbraio 2011, 01:01:50 CET »
0
grazie per la risposta,
quindi ora ti chiedo...
c'è quindi un modo per mantenere in ascolto il listener anche se l'app non è in background? cioè anche se il processo viene killato?

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:Funzionamento gps in android
« Risposta #3 il: 09 Febbraio 2011, 08:53:41 CET »
0
anziché pensare di mettere il listener all'interno di un'activity, potresti pensare di metterlo all'interno di un service.
Ovviamente, se killi il service il listener morirà con lui.
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Funzionamento gps in android
« Risposta #4 il: 09 Febbraio 2011, 10:48:09 CET »
0
anziché pensare di mettere il listener all'interno di un'activity, potresti pensare di metterlo all'interno di un service.
Ovviamente, se killi il service il listener morirà con lui.
e devi ricordarti di prevedere una chiusura del listener all'interno del service, perchè il service può rimanere alive per sempre, e il listener attaccato si mangia la batteria.
Tipo che ne so, nel tuo programma fai un'impostazione (Coordinate in Background) o tempo massimo di listening. Oppure alla pressione di un widget,insomma, qualcosa che lo disattiva male non fa!
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline MrKrabs

  • Utente junior
  • **
  • Post: 94
  • Respect: +4
    • Mostra profilo
Re:Funzionamento gps in android
« Risposta #5 il: 09 Febbraio 2011, 15:17:26 CET »
0
allora ho implementato un service che chiamo all'avvio della mia applicazione.

Codice (Java): [Seleziona]
public class ServiceAscoltoGps extends Service {
        public LocationManager locationManager;
        @Override
        public IBinder onBind(Intent intent) {
                return null;    }
        @Override
        public void onCreate() {
                locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, new MyLocationListener());
        }

        @Override
        public void onDestroy() {
                locationManager.removeUpdates(new MyLocationListener());
        }
        @Override
        public void onStart(Intent intent, int startid) {
               
                locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, new MyLocationListener());
        }
       
        public class MyLocationListener implements LocationListener {
        public void onLocationChanged(Location location) {
        }
        public void onStatusChanged(String s, int i, Bundle b) {                       
        }
        public void onProviderDisabled(String s) {
        }
        public void onProviderEnabled(String s) {                      
        }
    }
}

Ora però come prelevo il locationManager per utilizzarlo nella mia activity?

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:Funzionamento gps in android
« Risposta #6 il: 09 Febbraio 2011, 15:36:19 CET »
0
Nel ciclo di vita di un'activity, onstart viene invocato subito dopo oncreate, quindi mettilo solo su onstart.
Dai un'occhiata quì.

7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:Funzionamento gps in android
« Risposta #7 il: 09 Febbraio 2011, 15:39:05 CET »
0
Per quanto riguarda l'altra domanda, non devi passare il locationmanager all'activity, ma devi implementare un modo per fare comunicare service ed activity, cosicché ad ogni cambiamento l'activity venga aggiornata.
Dai un'occhiata quì.
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline MrKrabs

  • Utente junior
  • **
  • Post: 94
  • Respect: +4
    • Mostra profilo
Re:Funzionamento gps in android
« Risposta #8 il: 09 Febbraio 2011, 16:03:59 CET »
0
Praticamente dato che si tratta di un aggiornamento della posizione nel service, la comunicazione con l'activity è continua(almeno se ci sono cambiamenti di posizione). o sbaglio?!?

Comunque vorrei che il service informi l'activity della posizione attuale e che poi l'activity controlli se la posizione è in prossimità di un'altra posizione(precedentemente settata).
Praticamente l'activity fa questo...
Codice (Java): [Seleziona]
locationManager.addProximityAlert(
                latitude,
                longitude,
                POINT_RADIUS,
                PROX_ALERT_EXPIRATION,
                proximityIntent
       );

Citazione
...devi implementare un modo per fare comunicare service ed activity, cosicché ad ogni cambiamento l'activity venga aggiornata.
questo non mi è chiaro... o_O

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:Funzionamento gps in android
« Risposta #9 il: 09 Febbraio 2011, 17:31:33 CET »
0
hai provato a leggerti il link che ti ho messo nel secondo post?
Puoi fare comunicare tramite messaggi service ed activity.
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline MrKrabs

  • Utente junior
  • **
  • Post: 94
  • Respect: +4
    • Mostra profilo
Re:Funzionamento gps in android
« Risposta #10 il: 09 Febbraio 2011, 20:27:39 CET »
0
ho fatto come mi hai indicato...più o meno :-P
questo è l'onStart del service
Codice (Java): [Seleziona]
@Override
        public void onStart(Intent intent, int startid) {
               
        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

        locationManager.requestLocationUpdates(
                                LocationManager.GPS_PROVIDER,
                                0,
                                0,
                                new MyLocationListener()
        );
       
        Intent intent2 = new Intent(PROX_ALERT_INTENT);
        PendingIntent proximityIntent = PendingIntent.getBroadcast(this, 0, intent2, 0);
       
        SharedPreferences prefs = this.getSharedPreferences(getClass().getSimpleName(), Context.MODE_PRIVATE);
               
        locationManager.addProximityAlert(
                        prefs.getFloat(POINT_LATITUDE_KEY, 0) * 1000000,
                        prefs.getFloat(POINT_LONGITUDE_KEY, 0) * 1000000,
                        POINT_RADIUS,
                        PROX_ALERT_EXPIRATION,  
                        proximityIntent
        );
       
        IntentFilter filter = new IntentFilter(PROX_ALERT_INTENT);  
        registerReceiver(new ProximityIntentReceiver(), filter);
        }

Allora il service parte!
però non non capisco perchè non viene aggiornata la posizione e quindi inviato l'intent al broadcast receiver.
Come se il codice nell'onStart non venisse eseguito...

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:Funzionamento gps in android
« Risposta #11 il: 10 Febbraio 2011, 09:37:32 CET »
0
Hai provato ad attendere un po'?
Non è necessariamente immediato l'aggiornamento della posizione (avviene in maniera asincrona).
Inoltre, se il MyLocationListener è rimasto lo stesso da quando lo hai postato, se non implementi qualcosa all'interno della onLocationChanged, ovviamente non ti aggiorna nulla.

p.s.: non so a cosa serva la tua app, però se metti tempo e distanza a zero, avrai un aggiornamento continuo della posizione, il che potrebbe portare ad un consumo eccessivo della batteria. Cerca di calibrare la cosa in maniera intelligente verso le tue necessità, in modo da raggiungere un giusto compromesso tra funzionalità e consumo.
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline MrKrabs

  • Utente junior
  • **
  • Post: 94
  • Respect: +4
    • Mostra profilo
Re:Funzionamento gps in android
« Risposta #12 il: 10 Febbraio 2011, 14:55:09 CET »
0
Grazie mille per le tue risposte 7h38ugg3r, alla fine ho risolto.

questo era il mio problema:
Codice (Java): [Seleziona]
SharedPreferences prefs = this.getSharedPreferences(getClass().getSimpleName(), Context.MODE_PRIVATE);
non venivano catturate nel service le sharedPreference quindi le coordinate.

Ora, avendo l'aggiornamento della posizione nell'onStart del service, ti chiedo: il service mi permetterà di mantenere in ascolto il gps fino a che il service viene stoppato?
oppure controllerà la posizione all'avvio e poi niente più?
forse la risposta è già nella tua frase di prima
Citazione
Inoltre, se il MyLocationListener è rimasto lo stesso da quando lo hai postato, se non implementi qualcosa all'interno della onLocationChanged, ovviamente non ti aggiorna nulla.

però te lo domando ancora così vado sul sicuro :-P

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:Funzionamento gps in android
« Risposta #13 il: 10 Febbraio 2011, 16:30:48 CET »
0
Intendevo dire che quando si cambia locazione, viene invocato il locationChanged.
Se dentro questo tu non fai qualcosa che implementi lo scambio dei messaggi, il receiver non vedrà mai le modifiche.
Quanto detto non teneva conto, però, del proximity alert per cui dovrebbe essere tutto a posto.
 :-)

per fugare ogni dubbio, fai una prova e dimmi.
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/