Quando una funzionalità della tua app richiede l'accesso alla posizione, attendi che l'utente interagisca con la funzionalità prima di effettuare la richiesta di autorizzazione. Questo flusso di lavoro segue la best practice di richiedere le autorizzazioni di runtime nel contesto, come descritto nella guida che spiega come richiedere le autorizzazioni dell'app.
La Figura 1 mostra un esempio di come eseguire questa procedura. L'app contiene una funzionalità "Condividi posizione" che richiede l'accesso alla posizione in primo piano. Tuttavia, l'app non richiede l'autorizzazione di accesso alla posizione finché l'utente non seleziona il pulsante Condividi posizione.
L'utente può concedere solo la posizione approssimativa
Su Android 12 (livello API 31) o versioni successive, gli utenti possono richiedere che la tua app recuperi
solo le informazioni sulla posizione approssimativa, anche quando l'app richiede l'
ACCESS_FINE_LOCATION autorizzazione di runtime.
Per gestire questo potenziale comportamento dell'utente, non richiedere l'autorizzazione ACCESS_FINE_LOCATION da sola. Richiedi invece sia l'ACCESS_FINE_LOCATION
autorizzazione sia l'ACCESS_COARSE_LOCATION autorizzazione in un'unica richiesta di runtime. Se provi a richiedere solo ACCESS_FINE_LOCATION, il sistema ignora la richiesta in alcune release di Android 12. Se la tua app ha come target
Android 12 o versioni successive, il sistema registra il seguente messaggio di errore
in Logcat:
ACCESS_FINE_LOCATION must be requested with ACCESS_COARSE_LOCATION.
Quando la tua app richiede sia ACCESS_FINE_LOCATION sia ACCESS_COARSE_LOCATION, la finestra di dialogo delle autorizzazioni di sistema include le seguenti opzioni per l'utente:
- Esatta: consente alla tua app di ottenere informazioni sulla posizione esatta.
- Approssimativa: consente alla tua app di ottenere solo informazioni sulla posizione approssimativa.
La Figura 3 mostra che la finestra di dialogo contiene un suggerimento visivo per entrambe le opzioni, per aiutare l'utente a scegliere. Dopo che l'utente ha deciso la precisione della posizione, tocca uno dei tre pulsanti per selezionare la durata della concessione dell'autorizzazione.
Su Android 12 e versioni successive, gli utenti possono accedere alle impostazioni di sistema per impostare la precisione della posizione preferita per qualsiasi app, indipendentemente dalla versione dell'SDK target dell'app. Questo vale anche quando l'app è installata su un dispositivo con Android 11 o versioni precedenti e l'utente esegue l'upgrade del dispositivo ad Android 12 o versioni successive.
ACCESS_COARSE_LOCATION solo.ACCESS_FINE_LOCATION sia
ACCESS_COARSE_LOCATION in un'unica richiesta di runtime.
La scelta dell'utente influisce sulle concessioni delle autorizzazioni
La tabella seguente mostra le autorizzazioni che il sistema concede alla tua app, in base alle opzioni scelte dall'utente nella finestra di dialogo di runtime delle autorizzazioni:
| Esatta | Approssimativa | |
|---|---|---|
| Mentre usi l'app | ACCESS_FINE_LOCATION e ACCESS_COARSE_LOCATION |
ACCESS_COARSE_LOCATION |
| Solo questa volta | ACCESS_FINE_LOCATION e ACCESS_COARSE_LOCATION |
ACCESS_COARSE_LOCATION |
| Nega | Nessuna autorizzazione di accesso alla posizione | Nessuna autorizzazione di accesso alla posizione |
Per determinare quali autorizzazioni sono state concesse dal sistema alla tua app, controlla il valore restituito della richiesta di autorizzazioni. Puoi utilizzare le librerie Jetpack nel codice simile al seguente oppure puoi utilizzare le librerie della piattaforma, dove gestisci autonomamente il codice della richiesta di autorizzazione.
Kotlin
@RequiresApi(Build.VERSION_CODES.N) fun requestPermissions() { val locationPermissionRequest = registerForActivityResult( ActivityResultContracts.RequestMultiplePermissions() ) { permissions -> when { permissions.getOrDefault(Manifest.permission.ACCESS_FINE_LOCATION, false) -> { // Precise location access granted. } permissions.getOrDefault(Manifest.permission.ACCESS_COARSE_LOCATION, false) -> { // Only approximate location access granted. } else -> { // No location access granted. } } } // Before you perform the actual permission request, check whether your app // already has the permissions, and whether your app needs to show a permission // rationale dialog. For more details, see Request permissions: // https://developer.android.com/training/permissions/requesting#request-permission locationPermissionRequest.launch( arrayOf( Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION ) ) }
Java
private void requestPermissions() { ActivityResultLauncher<String[]> locationPermissionRequest = registerForActivityResult(new ActivityResultContracts .RequestMultiplePermissions(), result -> { Boolean fineLocationGranted = null; Boolean coarseLocationGranted = null; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { fineLocationGranted = result.getOrDefault( Manifest.permission.ACCESS_FINE_LOCATION, false); coarseLocationGranted = result.getOrDefault( Manifest.permission.ACCESS_COARSE_LOCATION,false); } if (fineLocationGranted != null && fineLocationGranted) { // Precise location access granted. } else if (coarseLocationGranted != null && coarseLocationGranted) { // Only approximate location access granted. } else { // No location access granted. } } ); // ... // Before you perform the actual permission request, check whether your app // already has the permissions, and whether your app needs to show a permission // rationale dialog. For more details, see Request permissions. locationPermissionRequest.launch(new String[] { Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION }); }
Richiedi un upgrade alla posizione esatta
Puoi chiedere all'utente di eseguire l'upgrade dell'accesso della tua app dalla posizione approssimativa alla posizione esatta. Prima di chiedere all'utente di eseguire l'upgrade dell'accesso della tua app alla posizione esatta, valuta se il caso d'uso della tua app richiede assolutamente questo livello di precisione. Se la tua app deve accoppiare un dispositivo con dispositivi nelle vicinanze tramite Bluetooth o Wi-Fi, valuta la possibilità di utilizzare l'accoppiamento di dispositivi complementari o le autorizzazioni Bluetooth anziché richiedere l'autorizzazione ACCESS_FINE_LOCATION
Per richiedere all'utente di eseguire l'upgrade dell'accesso alla posizione della tua app da approssimativa a esatta:
- Se necessario, spiega perché la tua app ha bisogno dell'autorizzazione.
- Richiedi di nuovo insieme le autorizzazioni
ACCESS_FINE_LOCATIONeACCESS_COARSE_LOCATION. Poiché l'utente ha già consentito al sistema di concedere la posizione approssimativa alla tua app, la finestra di dialogo del sistema è diversa questa volta, come mostrato nella Figura 4 e nella Figura 5:
Richiedi inizialmente solo la posizione in primo piano
Anche se diverse funzionalità della tua app richiedono l'accesso alla posizione, è probabile che solo alcune di esse richiedano l'accesso alla posizione in background. Pertanto, ti consigliamo di eseguire richieste incrementali per le autorizzazioni di accesso alla posizione, chiedendo prima l'accesso alla posizione in primo piano e poi l'accesso alla posizione in background. Eseguendo richieste incrementali, offri agli utenti maggiore controllo e trasparenza, perché possono capire meglio quali funzionalità della tua app richiedono l'accesso alla posizione in background.
La Figura 6 mostra un esempio di un'app progettata per gestire le richieste incrementali. Le funzionalità "Mostra posizione attuale" e "Consiglia luoghi nelle vicinanze" richiedono l'accesso alla posizione in primo piano. Tuttavia, solo la funzionalità "Consiglia luoghi nelle vicinanze" richiede l'accesso alla posizione in background.
La procedura per eseguire richieste incrementali è la seguente:
All'inizio, la tua app deve guidare gli utenti alle funzionalità che richiedono l'accesso alla posizione in primo piano, come la funzionalità "Condividi posizione" nella Figura 1 o la funzionalità "Mostra posizione attuale" nella Figura 2.
Ti consigliamo di disattivare l'accesso degli utenti alle funzionalità che richiedono l'accesso alla posizione in background finché la tua app non ha l'accesso alla posizione in primo piano.
In un secondo momento, quando l'utente esplora le funzionalità che richiedono l'accesso alla posizione in background, puoi richiedere l'accesso alla posizione in background.
Risorse aggiuntive
Per ulteriori informazioni sulle autorizzazioni di accesso alla posizione in Android, consulta i seguenti materiali:
Codelab
Video
Esempi
- App di esempio per dimostrare l'utilizzo delle autorizzazioni di accesso alla posizione.