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
scanning. Anziché attivare direttamente servizi come il GPS del dispositivo,
la tua app specifica il livello di accuratezza/consumo energetico richiesto e
l'intervallo di aggiornamento desiderato e il dispositivo apporta automaticamente le modifiche appropriate
alle impostazioni di sistema. Queste impostazioni sono definite dall'
LocationRequest
oggetto dati.
Questa lezione mostra come utilizzare il client delle impostazioni per controllare quali impostazioni sono attive e presentare la finestra di dialogo Impostazioni di localizzazione in modo che l'utente possa aggiornare le impostazioni con un solo tocco.
Configurare i servizi di localizzazione
Per utilizzare i servizi di localizzazione forniti da Google Play Services e il Fused Location Provider, collega la tua app utilizzando il Settings Client, 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 localizzazione devono richiedere le autorizzazioni di accesso alla posizione, a seconda dei casi d'uso di queste funzionalità.
Configurare una richiesta di localizzazione
Per archiviare i parametri delle richieste al Fused Location Provider, crea un
LocationRequest.
I parametri determinano il livello di precisione delle richieste di localizzazione. Per
i dettagli di tutte le opzioni di richiesta di localizzazione disponibili, consulta la
LocationRequest
documentazione di riferimento della classe. Questa lezione imposta l'intervallo di aggiornamento, l'intervallo di aggiornamento più veloce
e la priorità, come descritto di seguito:
- Intervallo di 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 essere disponibili affatto (ad esempio, se il dispositivo non ha connettività). - Intervallo di aggiornamento più veloce
-
setMinUpdateIntervalMillis(): questo metodo imposta la frequenza più veloce 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ù rapidi rispetto alla frequenza specificata insetInterval(), non devi chiamare questo metodo. - Priorità
-
setPriority(): questo metodo imposta la priorità della richiesta, fornendo ai servizi di localizzazione di Google Play Services un'indicazione precisa delle origini di localizzazione da utilizzare. Sono supportati i seguenti valori:-
PRIORITY_BALANCED_POWER_ACCURACY: utilizza questa impostazione per richiedere una precisione della localizzazione entro un isolato, ovvero una precisione di circa 100 metri. Questo è considerato un livello di precisione grossolano e probabilmente consuma meno energia. Con questa impostazione, è probabile che i servizi di localizzazione utilizzino il posizionamento tramite Wi-Fi e torri cellulari. Tieni presente, tuttavia, che la scelta del provider di localizzazione dipende da molti altri fattori, ad esempio dalle origini 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 una precisione a livello città, ovvero un'accuratezza di circa 10 chilometri. Questo è considerato un livello di precisione grossolano e probabilmente consuma meno energia.PRIORITY_PASSIVE: utilizza questa impostazione se hai bisogno di un impatto trascurabile sul consumo energetico, ma vuoi ricevere aggiornamenti della posizione quando sono disponibili. Con questa impostazione, la tua app non attiva alcun aggiornamento della posizione, ma riceve le posizioni attivate da altre app.
-
Crea la richiesta di localizzazione 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 Fused Location Provider restituisca aggiornamenti della posizione precisi entro 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 a lunga esecuzione dopo aver ricevuto un aggiornamento della posizione, imposta l'intervallo più veloce su un valore più lento. Questa modifica impedisce alla tua app di ricevere aggiornamenti che non può utilizzare. Una volta completata l'operazione a lunga esecuzione, imposta di nuovo l'intervallo più veloce su un valore rapido.
Recuperare le impostazioni di localizzazione attuali
Dopo aver eseguito 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 localizzazione. Il seguente snippet di codice mostra come
aggiungere la richiesta di localizzazione creata nel passaggio precedente:
Kotlin
val builder = LocationSettingsRequest.Builder() .addLocationRequest(locationRequest)
Java
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder() .addLocationRequest(locationRequest);
Controlla quindi 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 dell'attività 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.
Chiedere all'utente di modificare le impostazioni di localizzazione
Per determinare se le impostazioni di localizzazione sono appropriate per la localizzazione
richiesta, 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, che indica che le impostazioni
devono essere modificate. Quindi, visualizza una finestra di dialogo che chiede all'utente l'autorizzazione a
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 a 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, Richiedere aggiornamenti della posizione, mostra come ricevere aggiornamenti periodici della posizione.