L'uso appropriato delle informazioni sulla posizione può essere utile agli utenti della tua
  app. Ad esempio, se la tua app aiuta l'utente a orientarsi mentre cammina o
  guida oppure 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 movimento), l'altitudine o
  la velocità del dispositivo. Queste e altre informazioni sono disponibili nell'oggetto
  Location
  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 fornitori di servizi di localizzazione
  attualmente disponibili, 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 localizzazione.
Questa lezione mostra come richiedere aggiornamenti regolari sulla posizione di un dispositivo utilizzando il metodo requestLocationUpdates() nel provider di geolocalizzazione ibrida.
Recuperare l'ultima posizione nota
L'ultima posizione nota del dispositivo fornisce una base utile da cui
  iniziare, assicurando che l'app abbia una posizione nota prima di avviare gli
  aggiornamenti periodici della posizione. La lezione su
  Come ottenere l'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.
Effettuare una richiesta di posizione
Prima di richiedere aggiornamenti della posizione, la tua app deve connettersi ai servizi di localizzazione e fare una richiesta di posizione. La lezione su
  Modificare le impostazioni di localizzazione
  ti mostra come farlo. Una volta inviata una richiesta di localizzazione, puoi iniziare
  gli aggiornamenti regolari chiamando
  requestLocationUpdates().
A seconda della forma della richiesta, il fornitore di servizi di localizzazione combinati
  richiama il metodo di callback
  LocationCallback.onLocationResult() e gli trasmette un elenco di oggetti Location oppure
  emette un intent
  PendingIntent
  che contiene la posizione nei dati estesi. L'accuratezza 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 callback LocationCallback. Chiama
  requestLocationUpdates(),
  passando 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 posizione della tua app. Per
scoprire di più sulla conservazione del valore del flag booleano nelle istanze dell'attività, consulta Salvare lo stato dell'attività.
Definisci il callback di aggiornamento della posizione
Il Fused Location Provider richiama il metodo di callback
  LocationCallback.onLocationResult(). L'argomento in entrata contiene un oggetto elenco Location
  contenente la latitudine e la longitudine della località. Lo snippet seguente
  mostra come implementare l'interfaccia
  LocationCallback
  e definire il metodo, quindi ottenere il timestamp dell'aggiornamento della posizione
  e visualizzare latitudine, longitudine e 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'altra
  attività nella stessa app. Questa opzione 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 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 cambiamento dell'orientamento o della lingua dello schermo, 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 lo stato di un'istanza archiviato 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. 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 il riferimento alla classe Android Activity.
Nota:per uno spazio di archiviazione più persistente, puoi
  memorizzare le preferenze dell'utente nel
  SharedPreferences della tua app. Imposta la preferenza condivisa nel
  metodo onPause() dell'attività e
  recupera la preferenza in onResume().
  Per saperne di più sul salvataggio delle preferenze, consulta la sezione
  Salvataggio
  dei set chiave-valore.
Risorse aggiuntive
Per saperne di più, consulta le seguenti risorse:
Campioni
- App di esempio per mostrare la ricezione degli aggiornamenti della posizione in Android.
