Modificare le impostazioni di geolocalizzazione

Se la tua app deve richiedere la posizione o ricevere aggiornamenti delle autorizzazioni, il dispositivo deve abilitare le impostazioni di sistema appropriate, come la ricerca di GPS o Wi-Fi. Anziché abilitare direttamente servizi come il GPS del dispositivo, l'app specifica il livello richiesto di precisione/consumo energetico e l'intervallo di aggiornamento desiderato. Inoltre, 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 abilitate e mostra la finestra di dialogo delle impostazioni di geolocalizzazione per consentire all'utente di aggiornare le impostazioni con un solo tocco.

Configura servizi di geolocalizzazione

Per usare i servizi di geolocalizzazione forniti da Google Play Services e dal fornitore di servizi di geolocalizzazione integrato, connetti la tua app tramite il client per le impostazioni, quindi controlla le impostazioni di geolocalizzazione 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à.

Configurare una richiesta di posizione

Per archiviare i parametri per le richieste al provider di località combinato, crea un LocationRequest. I parametri determinano il livello di precisione delle richieste di posizione. Per i dettagli di tutte le opzioni disponibili per le richieste di località, consulta il riferimento della classe LocationRequest. Questa lezione consente di impostare l'intervallo di aggiornamento, l'intervallo di aggiornamento più rapido e la priorità, come descritto di seguito:

Intervallo di aggiornamento
setInterval() - Questo metodo imposta la frequenza in millisecondi alla quale la tua app preferisce ricevere gli aggiornamenti sulla posizione. Tieni presente che gli aggiornamenti della posizione potrebbero essere leggermente più veloci o più lenti di questa velocità per ottimizzare l'utilizzo della batteria oppure potrebbero non esserci del tutto (se il dispositivo non dispone di connettività, ad esempio).
Intervallo di aggiornamento più veloce
setFastestInterval() - Questo metodo imposta la frequenza più rapida in millisecondi con cui l'app può gestire gli aggiornamenti della posizione. A meno che la tua app non tragga vantaggio dalla ricezione degli aggiornamenti più rapidamente rispetto alla tariffa specificata in setInterval(), non devi chiamare questo metodo.
Priorità

setPriority(): questo metodo imposta la priorità della richiesta, in modo da fornire ai servizi di geolocalizzazione di Google Play Services un suggerimento efficace sulle origini di posizione da utilizzare. Sono supportati i seguenti valori:

  • PRIORITY_BALANCED_POWER_ACCURACY - Utilizza questa impostazione per richiedere la precisione della posizione all'interno di un isolato, che è una precisione di circa 100 metri. Questo è considerato un livello di precisione approssimativo e probabilmente consumerà meno energia. Con questa impostazione, è probabile che i servizi di geolocalizzazione utilizzino la posizione Wi-Fi e del ripetitore di telefonia mobile. Tuttavia, tieni presente che la scelta del provider di località dipende da molti altri fattori, come le origini disponibili.
  • PRIORITY_HIGH_ACCURACY - Utilizza questa impostazione per richiedere la posizione più precisa possibile. Con questa impostazione, è più probabile che i servizi di geolocalizzazione utilizzino il GPS per determinare la posizione.
  • PRIORITY_LOW_POWER - Utilizza questa impostazione per richiedere la precisione a livello di città, ovvero una precisione di circa 10 chilometri. Questo è considerato un livello di precisione approssimativo e probabilmente consumerà meno energia.
  • PRIORITY_NO_POWER - Utilizza questa impostazione se hai bisogno di un impatto trascurabile sul consumo energetico, ma vuoi ricevere gli 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()
      .setIntervalMillis(10000)
      .setFastestIntervalMillis(5000)
      .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
      .build()
}

Java

protected void createLocationRequest() {
  LocationRequest locationRequest = LocationRequest.Builder()
      .setIntervalMillis(10000)
      .setFastestIntervalMillis(5000)
      .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
      .build();
}

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

Suggerimento sulle prestazioni: se l'app accede alla rete o esegue altre operazioni a lunga esecuzione dopo aver ricevuto un aggiornamento della posizione, regola l'intervallo più rapido su un valore più basso. Questo aggiustamento impedisce all'app di ricevere aggiornamenti che non può utilizzare. Una volta terminato il lavoro a lunga esecuzione, imposta di nuovo l'intervallo più rapido su un valore veloce.

Visualizza le impostazioni di geolocalizzazione attuali

Dopo aver effettuato la connessione a Google Play Services e all'API dei servizi di geolocalizzazione, puoi visualizzare le impostazioni di geolocalizzazione attuali del dispositivo di un utente. Per farlo, crea una 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);

Dopodiché controlla se le impostazioni di geolocalizzazione correnti 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());

Una volta completato Task, la tua app può controllare le impostazioni di geolocalizzazione tramite il codice di stato dell'oggetto LocationSettingsResponse. Per ottenere ancora più dettagli sullo stato attuale delle impostazioni di geolocalizzazione pertinenti, la tua app può chiamare il metodo getLocationSettingsStates() dell'oggetto LocationSettingsResponse.

Chiedi all'utente di modificare le impostazioni di geolocalizzazione

Per determinare se le impostazioni di geolocalizzazione sono appropriate per la richiesta di posizione, aggiungi un elemento OnFailureListener all'oggetto Task per convalidare le impostazioni di geolocalizzazione. 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, visualizza una finestra di dialogo che richiede all'utente l'autorizzazione per modificare le impostazioni di geolocalizzazione chiamando il numero startResolutionForResult().

Il seguente snippet di codice mostra come determinare se le impostazioni di geolocalizzazione dell'utente consentono ai servizi di geolocalizzazione di creare una LocationRequest, nonché come chiedere all'utente l'autorizzazione per modificare le impostazioni di geolocalizzazione, 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 prossima lezione, Ricezione di aggiornamenti sulla posizione, mostra come ricevere aggiornamenti periodici sulla posizione.