Modificare le impostazioni di geolocalizzazione

Se la tua app deve richiedere la posizione o ricevere aggiornamenti delle autorizzazioni, il dispositivo deve attivare le impostazioni di sistema appropriate, ad esempio la scansione GPS o Wi-Fi. Anziché attivare direttamente servizi come il GPS del dispositivo, l'app specifica il livello di precisione/consumo energetico richiesto e l'intervallo di aggiornamento desiderato, mentre il dispositivo apporta automaticamente le modifiche appropriate alle impostazioni di sistema. Queste impostazioni sono definite dall'oggetto dati LocationRequest.

Questa lezione mostra come utilizzare il client delle impostazioni per verificare quali impostazioni sono attive e presentare la finestra di dialogo Impostazioni di localizzazione per consentire all'utente di aggiornare le proprie impostazioni con un solo tocco.

Configura i servizi di localizzazione

Per utilizzare i servizi di localizzazione forniti da Google Play Services e dal Fused Location Provider, connetti la tua app utilizzando il client delle impostazioni, quindi controlla le impostazioni di localizzazione attuali e chiedi all'utente di attivare le impostazioni richieste, se necessario.

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

Configura una richiesta di posizione

Per archiviare i parametri per le richieste al Fused Location Provider, crea un LocationRequest. I parametri determinano il livello di precisione delle richieste di posizione. Per maggiori dettagli su tutte le opzioni di richiesta di posizione disponibili, consulta la documentazione di riferimento della classe LocationRequest. Questa lezione imposta l'intervallo di aggiornamento, l'intervallo di aggiornamento più rapido e la priorità, come descritto di seguito:

Intervallo aggiornamento
setIntervalMillis() - Questo metodo imposta la frequenza in millisecondi con cui la tua app preferisce ricevere gli aggiornamenti della posizione. Tieni presente che gli aggiornamenti della posizione potrebbero essere leggermente più veloci o più lenti di questa frequenza per ottimizzare l'utilizzo della batteria oppure potrebbero non esserci aggiornamenti (ad esempio se il dispositivo non ha connettività).
Intervallo di aggiornamento più rapido
setMinUpdateIntervalMillis() - Questo metodo imposta la frequenza più rapida in millisecondi con cui la tua app può gestire gli aggiornamenti della posizione. A meno che la tua app non tragga vantaggio dalla ricezione di aggiornamenti più rapidamente della frequenza specificata in setInterval(), non è necessario chiamare questo metodo.
Priorità

setPriority() - Questo metodo imposta la priorità della richiesta, che fornisce ai servizi di localizzazione di Google Play Services un'indicazione chiara sulle origini località da utilizzare. Sono supportati i seguenti valori:

  • PRIORITY_BALANCED_POWER_ACCURACY - Utilizza questa impostazione per richiedere una precisione della posizione entro un isolato, ovvero un'approssimazione di circa 100 metri. Questo è considerato un livello di precisione approssimativo ed è probabile che consumi meno energia. Con questa impostazione, è probabile che i servizi di geolocalizzazione utilizzino il posizionamento Wi-Fi e delle torri cellulari. Tuttavia, tieni presente che la scelta del provider di posizione dipende da molti altri fattori, ad esempio quali origini sono disponibili.
  • PRIORITY_HIGH_ACCURACY - Utilizza questa impostazione per richiedere la posizione esatta. Con questa impostazione, è più probabile che i servizi di localizzazione utilizzino il GPS per determinare la posizione.
  • PRIORITY_LOW_POWER - Utilizza questa impostazione per richiedere la precisione a livello di città, ovvero un'accuratezza di circa 10 chilometri. Questo è considerato un livello di precisione approssimativo ed è probabile che consumi meno energia.
  • PRIORITY_PASSIVE - Utilizza questa impostazione se vuoi un impatto trascurabile sul consumo energetico, ma vuoi ricevere aggiornamenti sulla posizione quando disponibili. Con questa impostazione, l'app non attiva aggiornamenti della posizione, ma riceve le posizioni attivate da altre app.

Crea la richiesta di posizione e imposta i parametri come mostrato in questo esempio di codice:

Kotlin

  fun createLocationRequest() {
    val locationRequest = LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 10000)
        .setMinUpdateIntervalMillis(5000)
        .build()
}

Java

  protected void createLocationRequest() {
    LocationRequest locationRequest = new LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 10000)
            .setMinUpdateIntervalMillis(5000)
            .build();
}

La priorità di PRIORITY_HIGH_ACCURACY, combinata con l'impostazione dell'autorizzazione ACCESS_FINE_LOCATION definita nel file manifest dell'app e un intervallo di aggiornamento rapido di 5000 millisecondi (5 secondi), fa sì che il provider di localizzazione combinata restituisca aggiornamenti della posizione con un'approssimazione di pochi metri. Questo approccio è appropriato per le app di mappe che mostrano la posizione in tempo reale.

Suggerimento per le prestazioni: se la tua app accede alla rete o esegue altre operazioni di lunga durata dopo aver ricevuto un aggiornamento della posizione, regola l'intervallo più rapido su un valore più lento. Questa modifica impedisce alla tua app di ricevere aggiornamenti che non può utilizzare. Una volta completato il lavoro a lunga esecuzione, imposta nuovamente l'intervallo più rapido su un valore rapido.

Ottieni le impostazioni di localizzazione attuali

Una volta stabilita la connessione a Google Play Services e all'API dei servizi di localizzazione, puoi recuperare le impostazioni di localizzazione attuali del dispositivo di un utente. Per farlo, crea un LocationSettingsRequest.Builder e aggiungi una o più richieste di posizione. Il seguente snippet di codice mostra come aggiungere la richiesta di posizione creata nel passaggio precedente:

Kotlin

val builder = LocationSettingsRequest.Builder()
        .addLocationRequest(locationRequest)

Java

LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
     .addLocationRequest(locationRequest);

Poi, controlla se le impostazioni di localizzazione attuali sono soddisfatte:

Kotlin

val builder = LocationSettingsRequest.Builder()

// ...

val client: SettingsClient = LocationServices.getSettingsClient(this)
val task: Task<LocationSettingsResponse> = client.checkLocationSettings(builder.build())

Java

LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder();

// ...

SettingsClient client = LocationServices.getSettingsClient(this);
Task<LocationSettingsResponse> task = client.checkLocationSettings(builder.build());

Al termine di Task, la tua app può controllare le impostazioni di localizzazione esaminando il codice di stato dell'oggetto LocationSettingsResponse. Per ottenere ancora più dettagli sullo stato attuale delle impostazioni di localizzazione pertinenti, la tua app può chiamare il metodo getLocationSettingsStates() dell'oggetto LocationSettingsResponse.

Chiedi all'utente di modificare le impostazioni di localizzazione

Per determinare se le impostazioni di localizzazione sono appropriate per la richiesta di posizione, aggiungi un OnFailureListener all'oggetto Task che convalida le impostazioni di localizzazione. Poi, controlla se l'oggetto Exception passato al metodo onFailure() è un'istanza della classe ResolvableApiException, il che indica che le impostazioni devono essere modificate. Quindi, mostra una finestra di dialogo che chiede all'utente l'autorizzazione per modificare le impostazioni di localizzazione chiamando startResolutionForResult().

Il seguente snippet di codice mostra come determinare se le impostazioni di localizzazione dell'utente consentono ai servizi di localizzazione di creare un LocationRequest, nonché come chiedere all'utente l'autorizzazione per modificare le impostazioni di localizzazione, se necessario:

Kotlin

task.addOnSuccessListener { locationSettingsResponse ->
    // All location settings are satisfied. The client can initialize
    // location requests here.
    // ...
}

task.addOnFailureListener { exception ->
    if (exception is ResolvableApiException){
        // Location settings are not satisfied, but this can be fixed
        // by showing the user a dialog.
        try {
            // Show the dialog by calling startResolutionForResult(),
            // and check the result in onActivityResult().
            exception.startResolutionForResult(this@MainActivity,
                    REQUEST_CHECK_SETTINGS)
        } catch (sendEx: IntentSender.SendIntentException) {
            // Ignore the error.
        }
    }
}

Java

task.addOnSuccessListener(this, new OnSuccessListener<LocationSettingsResponse>() {
    @Override
    public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
        // All location settings are satisfied. The client can initialize
        // location requests here.
        // ...
    }
});

task.addOnFailureListener(this, new OnFailureListener() {
    @Override
    public void onFailure(@NonNull Exception e) {
        if (e instanceof ResolvableApiException) {
            // Location settings are not satisfied, but this can be fixed
            // by showing the user a dialog.
            try {
                // Show the dialog by calling startResolutionForResult(),
                // and check the result in onActivityResult().
                ResolvableApiException resolvable = (ResolvableApiException) e;
                resolvable.startResolutionForResult(MainActivity.this,
                        REQUEST_CHECK_SETTINGS);
            } catch (IntentSender.SendIntentException sendEx) {
                // Ignore the error.
            }
        }
    }
});

La lezione successiva, Richiedi aggiornamenti sulla posizione, mostra come ricevere aggiornamenti periodici sulla posizione.