Un uso appropriato delle informazioni sulla posizione può essere vantaggioso per gli utenti del tuo
dell'app. Ad esempio, se l'app aiuta l'utente a trovare la strada mentre cammina o
o se l'app monitora la posizione degli asset, deve recuperare
la posizione del dispositivo a intervalli regolari. Oltre alla posizione geografica (latitudine e longitudine), potresti fornire all'utente ulteriori informazioni, come la direzione (direzione orizzontale di marcia), l'altitudine o la velocità del dispositivo. Queste e altre informazioni sono disponibili in
Location
recuperabile dall'app
fusa
fornitore di servizi di localizzazione. In risposta, l'API aggiorna la tua app periodicamente con
la migliore posizione possibile, in base alla posizione attualmente disponibile
come Wi-Fi e GPS (Global Positioning System). La precisione della posizione è determinata dai fornitori, dalle autorizzazioni di accesso alla posizione che hai richiesto e dalle opzioni impostate nella richiesta di accesso alla posizione.
Questa lezione mostra come richiedere aggiornamenti regolari sulla posizione di un dispositivo utilizzando il metodo requestLocationUpdates()
nel fornitore di posizione combinato.
Ottenere l'ultima posizione nota
L'ultima posizione nota del dispositivo fornisce una base pratica da cui
assicurati che l'app abbia una posizione nota prima di avviare
aggiornamenti periodici della posizione. La lezione relativa
Recupero dell'ultima posizione nota ti 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
.
Inviare una richiesta di posizione
Prima di richiedere aggiornamenti sulla posizione, l'app deve connettersi alla posizione
servizi ed effettuare una richiesta di posizione. La lezione relativa
Modificare le impostazioni di geolocalizzazione
ti mostra come fare. Una volta che hai ricevuto una richiesta di posizione, puoi iniziare
gli aggiornamenti regolari richiamando
requestLocationUpdates()
A seconda della forma della richiesta, il fornitore di posizione combinato invoca il metodo di callback LocationCallback.onLocationResult()
e lo passa un elenco di oggetti Location
oppure emette un messaggio PendingIntent
che contiene la posizione nei dati estesi. La precisione e la frequenza di
gli aggiornamenti dipendono dalle autorizzazioni di accesso alla posizione che hai richiesto e dalle
impostate nell'oggetto della richiesta di posizione.
Questa lezione mostra come ricevere l'aggiornamento utilizzando l'approccio di callback
LocationCallback
. Chiama
requestLocationUpdates()
,
passandogli la tua 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 riportato sopra 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 geolocalizzazione della tua app. Per
di più sul mantenimento del valore del flag booleano tra le istanze
attività, consulta Salvare lo stato dell'attività.
Definisci il callback di aggiornamento della località
Il provider di località integrato richiama il
LocationCallback.onLocationResult()
di callback di Google. L'argomento in arrivo contiene un elenco Location
contenente la latitudine e la longitudine della posizione. Lo snippet seguente
mostra come implementare l'interfaccia
LocationCallback
e definire il metodo, quindi recuperare 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 interrompere gli aggiornamenti della posizione quando l'attività non è più attiva, 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()
,
passando 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 attivati. Nella sezione
onResume()
metodo, controlla
se gli aggiornamenti della posizione sono attivi o attivarli 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 l'orientamento dello schermo o la lingua, può causare l'eliminazione dell'attività corrente. Il tuo
l'app deve quindi memorizzare tutte le informazioni necessarie per ricreare l'attività.
Un modo per farlo è tramite uno stato dell'istanza memorizzato in un oggetto Bundle
.
Il seguente esempio di codice mostra come utilizzare il callback
onSaveInstanceState()
dell'attività 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 sono disponibili. Richiama il metodo dal
onCreate()
, come mostrato nel
nell'esempio di codice riportato di seguito:
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 Attività Android.
Nota: per uno spazio di archiviazione più persistente, puoi memorizzare le preferenze dell'utente nel SharedPreferences
della tua app. Imposta la preferenza condivisa in
il metodo onPause()
della tua attività e
recupera la preferenza in onResume()
.
Per ulteriori informazioni sulle preferenze di salvataggio, leggi
Risparmio
di coppie chiave-valore.
Risorse aggiuntive
Per scoprire di più, utilizza le seguenti risorse:
Campioni
- App di esempio per dimostrare la ricezione di aggiornamenti della posizione in Android.