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
posizione (latitudine e longitudine), potrebbe essere utile fornire all'utente
informazioni quali la direzione (direzione orizzontale di spostamento), l'altitudine o
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). L'accuratezza
la posizione è determinata dai fornitori,
autorizzazioni di accesso alla posizione che
richiesta e le opzioni impostate nella richiesta di posizione.
Questa lezione mostra come richiedere aggiornamenti regolari sulla
utilizzando
requestLocationUpdates()
nel provider di posizione fused.
Visualizza 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 sia già
ha recuperato l'ultima posizione nota e l'ha archiviata come
Location
oggetto 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 provider della posizione
richiama il
LocationCallback.onLocationResult()
di callback e gli passa un elenco di Location
oggetti oppure
emette un
PendingIntent
che contiene la località nei suoi dati estesi. L'accuratezza 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 ottenere l'aggiornamento utilizzando
LocationCallback
di richiamata. Chiama
requestLocationUpdates()
,
passando la tua istanza
LocationRequest
oggetto
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
, usato per monitorare se l'utente ha girato la posizione
attivare o disattivare gli aggiornamenti. Se gli utenti hanno disattivato gli aggiornamenti sulla posizione, puoi informare
dei requisiti per le località dell'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. Il seguente snippet
mostra come implementare
LocationCallback
a riga di comando e definire il metodo, quindi ottenere il timestamp dell'aggiornamento
e visualizzare la latitudine, la longitudine e il timestamp sul campo
dell'interfaccia:
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 sulla posizione
Valuta se interrompere gli aggiornamenti sulla posizione quando l'attività
non più a fuoco, ad esempio quando l'utente passa a un'altra app o a una
diverse attività nella stessa app. Può essere utile per ridurre l'alimentazione
consumo, a condizione che l'app non abbia bisogno di raccogliere informazioni anche quando
viene eseguita in background. Questa sezione illustra come interrompere
aggiornamenti nella sezione
onPause()
.
Per interrompere gli aggiornamenti sulla posizione, chiama
removeLocationUpdates()
,
passando un
LocationCallback
,
come illustrato 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 il valore booleano requestingLocationUpdates
per monitorare
se gli aggiornamenti della posizione sono attualmente attivi. 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(); } }
Salva lo stato dell'attività
Una modifica alla configurazione del dispositivo, ad esempio una modifica alla schermata
l'orientamento o la lingua possono 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 archiviato in un
Bundle
oggetto.
Il seguente esempio di codice mostra come utilizzare il parametro
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()
da ripristinare
i valori salvati dell'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 ulteriori informazioni sul salvataggio dello stato dell'istanza, consulta Android Riferimento della classe attività.
Nota: per uno spazio di archiviazione più permanente, puoi
memorizzare le preferenze dell'utente
nel pannello di controllo dell'app,
SharedPreferences
. 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 saperne di più, consulta le seguenti risorse:
Campioni
- App di esempio per dimostrare la ricezione di aggiornamenti della posizione in Android.