L'uso appropriato delle informazioni sulla posizione può essere utile per gli utenti della tua
app. Ad esempio, se la tua app aiuta l'utente a orientarsi mentre cammina o
guida o se monitora la posizione degli asset, deve ottenere la
posizione del dispositivo a intervalli regolari. Oltre alla posizione geografica (latitudine e longitudine), potresti voler fornire all'utente ulteriori
informazioni, come la direzione (direzione orizzontale di spostamento), l'altitudine o la
velocità del dispositivo. Queste e altre informazioni sono disponibili nell'
Location
oggetto che la tua app può recuperare dal
fused
location provider. In risposta, l'API aggiorna periodicamente la tua app con
la migliore posizione disponibile, in base ai provider di localizzazione attualmente disponibili,
come Wi-Fi e sistema GPS. La precisione di
la posizione è determinata dai provider, da
lle autorizzazioni di localizzazione che hai
richiesto e dalle opzioni impostate nella richiesta di localizzazione.
Questa lezione mostra come richiedere aggiornamenti regolari sulla posizione di un dispositivo utilizzando il requestLocationUpdates() metodo nel fused location provider.
Ottenere l'ultima posizione nota
L'ultima posizione nota del dispositivo fornisce una base pratica da cui
iniziare, assicurando che l'app abbia una posizione nota prima di avviare gli
aggiornamenti periodici della posizione. La lezione su
Ottenere l'ultima posizione nota mostra
come ottenere l'ultima posizione nota chiamando
getLastLocation().
Gli snippet nelle sezioni seguenti presuppongono che la tua app abbia già
recuperato l'ultima posizione nota e l'abbia memorizzata come oggetto
Location nella variabile globale
mCurrentLocation.
Effettuare una richiesta di localizzazione
Prima di richiedere gli aggiornamenti della posizione, la tua app deve connettersi ai servizi di localizzazione
ed effettuare una richiesta di localizzazione. La lezione su
Modificare le impostazioni di localizzazione
mostra come eseguire questa operazione. Una volta effettuata una richiesta di localizzazione, puoi avviare
gli aggiornamenti regolari chiamando
requestLocationUpdates().
A seconda del modulo della richiesta, il Fused Location Provider richiama il metodo di callback LocationCallback.onLocationResult() e gli passa un elenco di oggetti Location oppure emette un PendingIntent che contiene la posizione nei dati estesi. La precisione e la frequenza degli aggiornamenti sono influenzate dalle autorizzazioni di accesso alla posizione che hai richiesto e dalle opzioni impostate nell'oggetto della richiesta di localizzazione.
Questa lezione mostra come ottenere l'aggiornamento utilizzando l'approccio di
LocationCallback
callback. Chiama
requestLocationUpdates(),
passandogli l'istanza dell'
oggetto LocationRequest,
e un LocationCallback.
Definisci un metodo startLocationUpdates() come mostrato nel seguente esempio di codice:
Kotlin
override fun onResume() { super.onResume() if (requestingLocationUpdates) startLocationUpdates() } private fun startLocationUpdates() { fusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, Looper.getMainLooper()) }
Java
@Override protected void onResume() { super.onResume(); if (requestingLocationUpdates) { startLocationUpdates(); } } private void startLocationUpdates() { fusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, Looper.getMainLooper()); }
Tieni presente che lo snippet di codice sopra riportato fa riferimento a un flag booleano,
requestingLocationUpdates, utilizzato per monitorare se l'utente ha attivato o disattivato gli aggiornamenti della posizione. Se gli utenti hanno disattivato gli aggiornamenti della posizione, puoi informarli
del requisito di localizzazione della tua app. Per
saperne di più su come conservare il valore del flag booleano tra le istanze dell'
attività, consulta Salvare lo stato dell'attività.
Definire il callback di aggiornamento della posizione
Il fused location provider richiama il
LocationCallback.onLocationResult()
metodo di callback. L'argomento in entrata contiene un oggetto Location
di elenco contenente la latitudine e la longitudine della posizione. Lo snippet seguente
mostra come implementare l'
LocationCallback
interfaccia e definire il metodo, quindi ottenere il timestamp dell'aggiornamento della posizione
e visualizzare la latitudine, la longitudine e il timestamp nell'interfaccia utente dell'app:
Kotlin
private lateinit var locationCallback: LocationCallback // ... override fun onCreate(savedInstanceState: Bundle?) { // ... locationCallback = object : LocationCallback() { override fun onLocationResult(locationResult: LocationResult?) { locationResult ?: return for (location in locationResult.locations){ // Update UI with location data // ... } } } }
Java
private LocationCallback locationCallback; // ... @Override protected void onCreate(Bundle savedInstanceState) { // ... locationCallback = new LocationCallback() { @Override public void onLocationResult(LocationResult locationResult) { if (locationResult == null) { return; } for (Location location : locationResult.getLocations()) { // Update UI with location data // ... } } }; }
Interrompere gli aggiornamenti della posizione
Valuta se vuoi interrompere gli aggiornamenti della posizione quando l'attività non è
più in primo piano, ad esempio quando l'utente passa a un'altra app o a un'attività
diversa nella stessa app. Questa operazione può essere utile per ridurre il consumo
di energia, a condizione che l'app non debba raccogliere informazioni anche quando
è in esecuzione in background. Questa sezione mostra come interrompere gli
aggiornamenti nel metodo
onPause() dell'attività.
Per interrompere gli aggiornamenti della posizione, chiama
removeLocationUpdates(),
passandogli un
LocationCallback,
come mostrato nel seguente esempio di codice:
Kotlin
override fun onPause() { super.onPause() stopLocationUpdates() } private fun stopLocationUpdates() { fusedLocationClient.removeLocationUpdates(locationCallback) }
Java
@Override protected void onPause() { super.onPause(); stopLocationUpdates(); } private void stopLocationUpdates() { fusedLocationClient.removeLocationUpdates(locationCallback); }
Utilizza un valore booleano, requestingLocationUpdates, per monitorare
se gli aggiornamenti della posizione sono attualmente attivi. Nel metodo
onResume() dell'attività, controlla
se gli aggiornamenti della posizione sono attualmente attivi e attivali in caso contrario:
Kotlin
override fun onResume() { super.onResume() if (requestingLocationUpdates) startLocationUpdates() }
Java
@Override protected void onResume() { super.onResume(); if (requestingLocationUpdates) { startLocationUpdates(); } }
Salvare lo stato dell'attività
Una modifica alla configurazione del dispositivo, ad esempio un cambio di orientamento dello schermo
o di lingua, può causare la distruzione dell'attività corrente. Pertanto, la tua app deve memorizzare tutte le informazioni necessarie per ricreare l'attività.
Un modo per farlo è tramite uno stato dell'istanza memorizzato in un
Bundle oggetto.
Il seguente esempio di codice mostra come utilizzare il callback dell'attività
onSaveInstanceState()
per salvare lo stato dell'istanza:
Kotlin
override fun onSaveInstanceState(outState: Bundle?) { outState?.putBoolean(REQUESTING_LOCATION_UPDATES_KEY, requestingLocationUpdates) super.onSaveInstanceState(outState) }
Java
@Override protected void onSaveInstanceState(Bundle outState) { outState.putBoolean(REQUESTING_LOCATION_UPDATES_KEY, requestingLocationUpdates); // ... super.onSaveInstanceState(outState); }
Definisci un metodo updateValuesFromBundle() per ripristinare
i valori salvati dall'istanza precedente dell'attività, se disponibili. Chiama il metodo dal metodo
onCreate() dell'attività, come mostrato nel
seguente esempio di codice:
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { // ... updateValuesFromBundle(savedInstanceState) } private fun updateValuesFromBundle(savedInstanceState: Bundle?) { savedInstanceState ?: return // Update the value of requestingLocationUpdates from the Bundle. if (savedInstanceState.keySet().contains(REQUESTING_LOCATION_UPDATES_KEY)) { requestingLocationUpdates = savedInstanceState.getBoolean( REQUESTING_LOCATION_UPDATES_KEY) } // ... // Update UI to match restored state updateUI() }
Java
@Override public void onCreate(Bundle savedInstanceState) { // ... updateValuesFromBundle(savedInstanceState); } private void updateValuesFromBundle(Bundle savedInstanceState) { if (savedInstanceState == null) { return; } // Update the value of requestingLocationUpdates from the Bundle. if (savedInstanceState.keySet().contains(REQUESTING_LOCATION_UPDATES_KEY)) { requestingLocationUpdates = savedInstanceState.getBoolean( REQUESTING_LOCATION_UPDATES_KEY); } // ... // Update UI to match restored state updateUI(); }
Per saperne di più sul salvataggio dello stato dell'istanza, consulta la documentazione di riferimento della classe Android Activity.
Nota: per uno spazio di archiviazione permanente, puoi
memorizzare le preferenze dell'utente in
SharedPreferences della tua app. Imposta la preferenza condivisa nel
metodo onPause() dell'attività e
recuperala in onResume().
Per saperne di più sul salvataggio delle preferenze, consulta
Salvare
set di coppie chiave-valore.
Risorse aggiuntive
Per saperne di più, consulta le seguenti risorse:
Esempi
- App di esempio per dimostrare la ricezione degli aggiornamenti della posizione in Android.