Se la tua app deve richiedere la posizione o ricevere aggiornamenti delle autorizzazioni, il
dispositivo deve attivare le impostazioni di sistema appropriate, come la scansione del GPS o del Wi-Fi. Anziché attivare direttamente servizi come il GPS del dispositivo,
la tua app specifica il livello richiesto di precisione/consumo energetico e
l'intervallo di aggiornamento desiderato e 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 Impostazioni per controllare quali impostazioni sono attivate e presentare la finestra di dialogo Impostazioni di geolocalizzazione per consentire all'utente di aggiornare le impostazioni con un solo tocco.
Configurare i servizi di geolocalizzazione
Per utilizzare i servizi di geolocalizzazione forniti da Google Play Services e dal fornitore di posizione combinato, collega la tua app utilizzando il client 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 accesso alla posizione
Per memorizzare i parametri per le richieste al fornitore di servizi di geolocalizzazione combinati, crea un
LocationRequest
.
I parametri determinano il livello di precisione per le richieste di geolocalizzazione. Per dettagli su tutte le opzioni di richiesta di posizione disponibili, consulta il 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 di aggiornamento
-
setInterval()
- 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ù rapidi 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
-
setFastestInterval()
- 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 insetInterval()
, non è necessario chiamare questo metodo. - Priorità
-
setPriority()
- Questo metodo imposta la priorità della richiesta, che fornisce ai servizi di geolocalizzazione di Google Play Services un'indicazione precisa sulle origini posizione da utilizzare. Sono supportati i seguenti valori:-
PRIORITY_BALANCED_POWER_ACCURACY
- Utilizza questa impostazione per richiedere una precisione della posizione entro un isolato della città, ovvero una precisione di circa 100 metri. Questo è considerato un livello approssimativo di precisione e probabilmente consuma meno energia. Con questa impostazione, i servizi di geolocalizzazione potrebbero utilizzare il posizionamento Wi-Fi e delle torri di telefonia mobile. Tieni presente, però, che la scelta del fornitore di servizi di localizzazione dipende da molti altri fattori, ad esempio quali fonti sono disponibili. -
PRIORITY_HIGH_ACCURACY
- Utilizza questa impostazione per richiedere la posizione più precisa possibile. Con questa impostazione, i servizi di geolocalizzazione hanno maggiori probabilità di utilizzare il GPS per determinare la posizione. PRIORITY_LOW_POWER
- Utilizza questa impostazione per richiedere una precisione a livello di città, ovvero un'accuratezza di circa 10 chilometri. Questo è considerato un livello di precisione approssimativo e dovrebbe consumare meno energia.PRIORITY_NO_POWER
- Utilizza questa impostazione se vuoi un impatto trascurabile sul consumo energetico, ma vuoi ricevere aggiornamenti sulla posizione quando sono disponibili. Con questa impostazione, l'app non attiva aggiornamenti della posizione, ma riceve le posizioni attivate da altre app.
-
Crea la richiesta di geolocalizzazione 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 dell'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 fornitore di posizione fusionato
restituisca aggiornamenti della posizione precisi al metro.
Questo approccio è appropriato per le app di mappatura che mostrano la posizione in tempo reale.
Suggerimento per le prestazioni: se l'app accede alla rete o esegue altri lavori di lunga durata dopo aver ricevuto un aggiornamento della posizione, regola l'intervallo più veloce su un valore più lento. Questo aggiustamento impedisce all'app di ricevere aggiornamenti che non può utilizzare. Al termine del lavoro a lunga esecuzione, reimposta l'intervallo più veloce su un valore rapido.
Ottenere le impostazioni di geolocalizzazione attuali
Dopo aver eseguito la connessione a Google Play Services e all'API Location Services, puoi recuperare le impostazioni di geolocalizzazione attuali del dispositivo di un utente. Per farlo, crea un LocationSettingsRequest.Builder
e aggiungi una o più richieste di geolocalizzazione. Il seguente snippet di codice mostra come
aggiungere la richiesta di geolocalizzazione creata nel passaggio precedente:
Kotlin
val builder = LocationSettingsRequest.Builder() .addLocationRequest(locationRequest)
Java
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder() .addLocationRequest(locationRequest);
Successivamente, controlla se le impostazioni di geolocalizzazione 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'operazione Task
, la tua app può controllare le impostazioni di geolocalizzazione esaminando il codice di stato dell'oggetto LocationSettingsResponse
. Per ottenere ulteriori dettagli sullo stato corrente delle impostazioni di geolocalizzazione pertinenti, la tua app può chiamare il metodo getLocationSettingsStates()
dell'oggetto LocationSettingsResponse
.
Chiedere all'utente di modificare le impostazioni di geolocalizzazione
Per determinare se le impostazioni di geolocalizzazione sono appropriate per la richiesta di geolocalizzazione, aggiungi un
OnFailureListener
all'oggetto
Task
che convalida 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. Poi, visualizza una finestra di dialogo che chiede all'utente l'autorizzazione per modificare le impostazioni di geolocalizzazione chiamando
startResolutionForResult()
.
Il seguente snippet di codice mostra come determinare se le impostazioni di geolocalizzazione dell'utente consentono ai servizi di geolocalizzazione di creare un
LocationRequest
, nonché come chiedere all'utente l'autorizzazione a 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 lezione successiva, Ricevere aggiornamenti sulla posizione, ti mostra come ricevere aggiornamenti periodici sulla posizione.