2010-01-02 8 views
5

Sto utilizzando il metodo requestLocationUpdates() del responsabile della posizione per ricevere periodicamente un messaggio sul destinatario della mia trasmissione. Il sistema sta attivando correttamente l'intento sul mio ricevitore e sono stato in grado di usarlo correttamente. L'unico problema è che il localizzatore GPS rimane attivo per alcuni secondi dopo l'acquisizione della posizione iniziale, e ho bisogno che rimanga un po 'più a lungo in modo che le stime di posizione siano più accurate.Android: come mantenere attivo il GPS finché non viene fornita una posizione più precisa?

La mia domanda è come rendere il fornitore di posizione GPS rimanere attivo per ogni richiesta periodica che proviene da LocationManager requestLocationUpdates. Qualcuno sa come fare questo?

risposta

7

Prova qualcosa del genere. Penso che sia l'approccio giusto

private void createGpsListner() 
{ 
    gpsListener = new LocationListener(){ 
     public void onLocationChanged(Location location) 
     { 
      curLocation = location; 

      // check if locations has accuracy data 
      if(curLocation.hasAccuracy()) 
      { 
       // Accuracy is in rage of 20 meters, stop listening we have a fix 
       if(curLocation.getAccuracy() < 20) 
       { 
        stopGpsListner(); 
       } 
      } 
     } 
     public void onProviderDisabled(String provider){} 
     public void onProviderEnabled(String provider){} 
     public void onStatusChanged(String provider, int status, Bundle extras){} 
    }; 
} 

private void startGpsListener() 
{ 

    if(myLocationManager != null) 
     // hit location update in intervals of 5sec and after 10meters offset 
     myLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 10, gpsListener); 
} 

private void stopGpsListner() 
{ 
    if(myLocationManager != null) 
     myLocationManager.removeUpdates(gpsListener); 
} 
+1

grazie per il codice. hasAccuracy e getAccuracy mi hanno aiutato. Ma un dubbio, se il GPS non ha precisione entro 20 (in alcuni punti potrebbe essere), continuerà a cercare ryt? Cosa deve essere fatto ?? – SSS

0

se si mantiene attivo LocationListener, deve continuare a ricevere gli aggiornamenti su onLocationChanged() se la precisione della correzione si restringe. e infatti location.getAccuracy() ti dirà la precisione attuale

forse impostare minTime e minDistance sia a 0 per ricevere gli aggiornamenti con maggiore frequenza? userà più batteria, ma è più preordinata.

+1

Sono utilizzando un ricevitore broadcast con la versione PendingIntent del metodo. Inoltre, la precisione della correzione migliora, ma smette di aggiornarsi molto prima del suo potenziale di accuratezza, quindi non posso semplicemente usare getAccuracy(). Ne ho bisogno per continuare ad aggiornare finché la precisione non migliora molto e non è sufficiente. – Doughy

+0

Non sto usando un avviso di prossimità. Sto richiedendo che il LocationManager mi dia le correzioni periodiche che tornano alla mia applicazione tramite un ricevitore broadcast, cosa che accade ogni volta che la posizione "cambia". Il LocationManager o il fornitore di localizzazione GPS non rimangono attivi abbastanza a lungo perché le posizioni siano molto precise. Anche se uso un ascoltatore, ciò non cambia il fatto che il GPS non rimane attivo per molto tempo. – Doughy

+0

Hai provato a suggerire jspcal di impostare il minTime su 0 o simile? Se questo ti dà aggiornamenti frequenti che presto diventano abbastanza precisi (o dopo un timeout) potresti aggiornare la tua richiesta di aggiornamento di LocationManager al valore minTime desiderato. –

0

per ottenere la posizione GPS a intervalli definiti, ottenere la posizione da onLocationChanged metodo LocationListener e in onResume metodo di specificare i tempi in milliseconds per ottenere aggiornamenti periodici

onResume 
location_manager.requestLocationUpdates(provider, 1000, 1, MainActivity.this); 
Problemi correlati