Recupera l'ultima posizione nota

Utilizzando le API di geolocalizzazione di Google Play Services, la tua app può richiedere l'ultima posizione nota del dispositivo dell'utente. Nella maggior parte dei casi ti interessa la posizione attuale dell'utente, che di solito equivale all'ultima posizione nota del dispositivo.

In particolare, utilizza il fornitore di posizione con fusibile per recuperare l'ultima posizione nota del dispositivo. Il provider di servizi di localizzazione è una delle API di geolocalizzazione in Google Play Services. Gestisce la tecnologia di geolocalizzazione sottostante e fornisce un'API semplice in modo da poter specificare requisiti ad alto livello, come alta precisione o bassa potenza. Inoltre, consente di ottimizzare l'utilizzo della batteria da parte del dispositivo.

Nota: se l'app è in esecuzione in background, l'accesso alla posizione deve essere fondamentale per la funzionalità di base dell'app ed è accompagnato da un'opportuna informativa agli utenti.

Questa lezione mostra come effettuare una singola richiesta per la posizione di un dispositivo utilizzando il metodo getLastLocation() nel provider di posizione fuso.

Configurare Google Play Services

Per accedere al fornitore della posizione integrata, il progetto di sviluppo della tua app deve includere Google Play Services. Scarica e installa il componente Google Play Services tramite SDK Manager, quindi aggiungi la libreria al progetto. Per maggiori dettagli, consulta la guida alla configurazione di Google Play Services.

Specifica le autorizzazioni app

Le app le cui funzionalità usano i servizi di geolocalizzazione devono richiedere le autorizzazioni di accesso alla posizione, a seconda dei casi d'uso di queste funzionalità.

Crea client di servizi di geolocalizzazione

Nel metodo onCreate() dell'attività, crea un'istanza del client Fused Location Provider come mostrato nel seguente snippet di codice.

Kotlin

private lateinit var fusedLocationClient: FusedLocationProviderClient

override fun onCreate(savedInstanceState: Bundle?) {
    // ...

    fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
}

Java

private FusedLocationProviderClient fusedLocationClient;

// ..

@Override
protected void onCreate(Bundle savedInstanceState) {
    // ...

    fusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
}

Ottenere l'ultima posizione nota

Una volta creato il client dei servizi di geolocalizzazione, puoi ottenere l'ultima posizione nota del dispositivo di un utente. Quando la tua app è connessa a questi servizi, puoi utilizzare il metodo getLastLocation() del provider di posizione fuso per recuperare la posizione del dispositivo. La precisione della posizione restituita da questa chiamata è determinata dall'impostazione di autorizzazione inserita nel file manifest dell'app, come descritto nella guida su come richiedere le autorizzazioni di accesso alla posizione.

Per richiedere l'ultima posizione nota, chiama il metodo getLastLocation(). Lo snippet di codice riportato di seguito illustra la richiesta e una semplice gestione della risposta:

Kotlin

fusedLocationClient.lastLocation
        .addOnSuccessListener { location : Location? ->
            // Got last known location. In some rare situations this can be null.
        }

Java

fusedLocationClient.getLastLocation()
        .addOnSuccessListener(this, new OnSuccessListener<Location>() {
            @Override
            public void onSuccess(Location location) {
                // Got last known location. In some rare situations this can be null.
                if (location != null) {
                    // Logic to handle location object
                }
            }
        });

Il metodo getLastLocation() restituisce un Task che puoi utilizzare per ottenere un oggetto Location con le coordinate di latitudine e longitudine di una posizione geografica. L'oggetto location potrebbe essere null nelle seguenti situazioni:

  • La geolocalizzazione è disattivata nelle impostazioni del dispositivo. Il risultato potrebbe essere null anche se l'ultima posizione è stata recuperata in precedenza perché la disattivazione della località svuota anche la cache.
  • Il dispositivo non ha mai registrato la sua posizione, il che potrebbe essere causato da un nuovo dispositivo o dalle impostazioni di fabbrica ripristinate.
  • Google Play Services sul dispositivo è stato riavviato e non è presente alcun client Fused Location Provider attivo che ha richiesto la posizione dopo il riavvio dei servizi. Per evitare che si verifichi questa situazione, puoi creare un nuovo client e richiedere personalmente gli aggiornamenti della posizione. Per maggiori informazioni, consulta la sezione Ricevere aggiornamenti sulla posizione.

Scegli la stima della posizione migliore

L'FusedLocationProviderClient offre diversi metodi per recuperare le informazioni sulla posizione del dispositivo. Scegli una delle seguenti opzioni, a seconda del caso d'uso della tua app:

  • getLastLocation() riceve una stima della posizione più rapidamente e riduce al minimo l'utilizzo della batteria che può essere attribuito alla tua app. Tuttavia, le informazioni sulla posizione potrebbero essere obsolete se nessun altro client ha usato attivamente la posizione di recente.
  • getCurrentLocation() riceve una posizione più aggiornata e precisa in modo più coerente. Tuttavia, questo metodo può causare il calcolo della posizione attivo sul dispositivo

    Questo è il modo consigliato per ottenere una nuova posizione, quando possibile, ed è più sicuro rispetto ad alternative come l'avvio e la gestione automatica degli aggiornamenti della posizione utilizzando requestLocationUpdates(). Se la tua app chiama requestLocationUpdates(), a volte l'app può consumare grandi quantità di energia se la posizione non è disponibile o se la richiesta non viene interrotta correttamente dopo aver ottenuto una nuova posizione.

Risorse aggiuntive

Per maggiori informazioni sul recupero della posizione attuale in Android, consulta i seguenti materiali:

Campioni

  • App di esempio per dimostrare le best practice durante il recupero della posizione attuale.