Richiedere gli aggiornamenti di posizione

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.