2010-08-22 10 views
8

Questo è il mio modo di ascolto per gli aggiornamenti di posizione GPS (utilizzando LocationManager e un LocationListener):Android: LocationManager regolare dinamicamente MINTIME/minDistance soglie

locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 
listener = new MyLocationistener(); // LocationListener 
locationManager.requestLocationUpdates(
     LocationManager.GPS_PROVIDER, 
     30000, // milliseconds (minTime) 
     20, // meters (minDistance) 
     listener); 

Ma vorrei regolare dinamicamente le minTime e minDistance argomenti utilizzati di LocationManager#requestLocationUpdates. Il mio obiettivo è quello di risparmiare la batteria, in base a diversi criteri di utilizzo, vale a dire:

  • Se l'utente non è in movimento, aumentano la MINTIME per ottenere un aggiornamento di posizione
  • Se l'utente si muove molto velocemente, aumentare la minDistance
  • Se l'utente è in casa (senza copertura GPS), aumentare sia
  • Se la batteria è troppo basso, aumentare sia
  • ... (qualsiasi altra euristica)

Mi piacerebbe sapere:

  1. È davvero una buona idea per risparmiare la durata della batteria?
  2. Come posso fare questo tipo di regolazioni? Posso chiamare di nuovo sia LocationManager#removeUpdates che LocationManager#requestLocationUpdates, se c'è l'unica alternativa.
  3. Qualche idea o codice di esempio che conosci per implementare questo tipo di algoritmi adattivi?

Modifica: l'applicazione è un sistema di tracciamento per sapere dove si trovano le persone, al fine di assegnare compiti alla persona più vicina a una determinata posizione. In realtà la batteria dura poco più di 8 ore, quindi mi piacerebbe aumentarla.

+0

Interessante domanda però non posso aiutare molto. Penso che sia una buona idea risparmiare batteria. E tenderei a dire che la soluzione che suggerisci è l'unica, ma non sono esperto nell'API di localizzazione, quindi lascerò che gli altri parlino. – Sephy

+0

[Ho usato lo stesso codice in mia applicazione ma does'nt restituisce tutti i valori, chiedevo se qualcuno di ragazzi yu mi potrebbe aiutare con ...] [1] [1]: http: //stackoverflow.com/questions/9514980/android-getting-speed-with-gps –

+0

rimuovere e aggiungere, proprio come questo: https://stackoverflow.com/questions/5385094/change-mintime-for-gps-locationlistener- dinamicamente – jp1017

risposta

4

AFAIK è necessario chiamare ancora removeUpdates e requestLocationUpdates.

Inoltre puoi guardare in altri modi per vedere se il telefono si sta muovendo affatto, come l'accelerometro. Leggi su di esso here e see this other question's answers

Ma il dare più idea, è necessario presentare il problema stesso. Non cercare di ottimizzare in anticipo, fino a quando non si verifica un problema. Se hai bisogno di postare dettagli su di esso.

+0

Grazie. Si tratta di un'applicazione interna, in cui gli utenti hanno poche competenze tecniche, quindi non sanno cosa sia un GPS e costringendoli a modificare le impostazioni o attivare e disattivare la radio GPA hanno problemi di usabilità. La batteria ha una durata di 8-10 ore e dobbiamo prolungarla per almeno 12 ore. –

1

Questa è davvero una buona idea per risparmiare la durata della batteria?

Probabilmente no. AFAIK, la radio GPS sarà attiva per tutto il tempo, e questo è il più grande consumo di batteria in quello che stai descrivendo. Il modo per risparmiare la batteria è rimuovere gli aggiornamenti, quindi la radio GPS si spegne. Tuttavia, la prossima volta che richiedi aggiornamenti della posizione, ci vorrà del tempo prima che il GPS acquisisca la sua correzione iniziale.

Se l'utente è in casa (senza copertura GPS), aumentare sia

Se non è possibile ottenere una posizione GPS, spegnere la radio, e riprovare un determinato numero di minuti più tardi (o sulla base di un evento UI o qualcosa del genere). Non ha senso lasciare il GPS acceso se non ti sta facendo del bene.

Se la batteria è troppo bassa, aumentare sia

Se la batteria è troppo basso, spegnere il GPS. Passa a un provider a basso consumo (usa Criteria per trovarne uno) o vai senza dati sulla posizione. Lascia che l'utente decida cosa è "troppo basso" tramite una preferenza.

+0

Grazie. Quando pensi che sia meglio tenere accesa la radio GPS (meglio che spegnerla e riaccenderla). Secondi, minuti? Voglio dire, forse se ho bisogno di una correzione ogni 30 secondi, è meglio tenerlo acceso, ma non sarebbe vero se hai bisogno di una correzione ogni 5 minuti. –

+1

Non è possibile cambiare il GPS in modo programmatico, l'utente deve accenderlo automaticamente. Puoi semplicemente presentare loro la schermata delle impostazioni. – Pentium10

+0

Per rispondere alla frequenza con cui è necessario eseguire il polling dei dati, fornirci maggiori dettagli. Ad esempio, per che cosa stai utilizzando i dati sulla posizione? – Pentium10

1

ho fatto qualcosa di simile:

ho avuto un LocationService (si estende Service e implementa LocationListener). e ho aggiunto

locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 
locationManager.requestLocationUpdates(LocationManager.PASSIVE_PROVIDER, 1, 1, this); 

e nel onLocationChangedListener:

public void onLocationChanged(Location location) { 
     AlarmManager aleManager = (AlarmManager) LocationService.context.getSystemService(ALARM_SERVICE); 
//Change the values of MINIMIUM_TRIGGER_TIME and INTERVAL_TIME 
     Intent forceLoc = new Intent(LocationService.context, 
       ForceLocationService.class); 
     PendingIntent pendingForceLoc = PendingIntent.getService(
       LocationService.context, 0, forceLoc, 
       PendingIntent.FLAG_ONE_SHOT); 
     // CANCEL PREVIOUS alarm and set new one 
     aleManager.cancel(pendingForceLoc); 
     aleManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, 
       MINIMIUM_TRIGGER_TIME, INTERVAL_TIME, pendingForceLoc); 
    } 

e Nel ForceLocationService (estende IntentService) innescare la regolare posizione ascoltatore in questo modo:

locMan=(LocationManager)getSystemService(LOCATION_SERVICE); 
locMan.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1, 1, locationService); 

Questo mi permette di fare il seguenti:

  1. Se il sistema ottiene qualsiasi aggiornamento di posizione prima che alarmManager attivi ForceLocationService, ottiene automaticamente l'aggiornamento e reimposta l'allarme.

  2. Se non riceve l'aggiornamento fino all'attivazione dell'allarme, quindi forza l'allarme a innescarsi, assicurando così che si ottiene l'aggiornamento quando necessario.

L'unico problema che ho è che, non funziona se non v'è alcun cambiamento nella posizione causa il reset di allarme viene fatto in onLocationChanged().

Problemi correlati