Per proteggere la privacy degli utenti, le app che utilizzano i servizi di geolocalizzazione devono richiedere le autorizzazioni di accesso alla posizione.
Quando richiedi le autorizzazioni di accesso alla posizione, segui le stesse best practice che useresti per qualsiasi altra autorizzazione di runtime. Una differenza importante per quanto riguarda le autorizzazioni di accesso alla posizione è che il sistema include più autorizzazioni correlate alla posizione. Le autorizzazioni richieste e il modo in cui vengono richieste dipendono dai requisiti di accesso alla posizione per il caso d'uso della tua app.
Questa pagina descrive i diversi tipi di requisiti relativi alla posizione e fornisce indicazioni su come richiedere le autorizzazioni di accesso alla posizione in ogni caso.
Tipi di accesso alla posizione
Ogni autorizzazione ha una combinazione delle seguenti caratteristiche:
- Categoria: Posizione in primo piano o Posizione sfondo.
- Precisione: posizione esatta o posizione approssimativa.
Posizione in primo piano
Se la tua app contiene una funzionalità che condivide o riceve dati sulla posizione solo una volta o per un periodo di tempo definito, questa funzionalità richiede l'accesso alla posizione in primo piano. Ecco alcuni esempi:
- In un'app di navigazione, una funzionalità consente agli utenti di ricevere indicazioni stradali passo passo.
- All'interno di un'app di messaggistica, una funzionalità consente agli utenti di condividere la propria posizione attuale con un altro utente.
Il sistema considera che la tua app utilizzi la posizione in primo piano se una funzionalità della tua app accede alla posizione corrente del dispositivo in una delle seguenti situazioni:
- È visibile un'attività che appartiene alla tua app.
La tua app esegue un servizio in primo piano. Quando è in esecuzione un servizio in primo piano, il sistema avvisa l'utente mostrando una notifica persistente. L'app mantiene l'accesso quando è in background, ad esempio quando l'utente preme il pulsante Home sul dispositivo o spegne il display.
Inoltre, ti consigliamo di dichiarare un tipo di servizio in primo piano di
location
, come mostrato nello snippet di codice seguente. Su Android 10 (livello API 29) e versioni successive, devi dichiarare questo tipo di servizio in primo piano.<!-- Recommended for Android 9 (API level 28) and lower. --> <!-- Required for Android 10 (API level 29) and higher. --> <service android:name="MyNavigationService" android:foregroundServiceType="location" ... > <!-- Any inner elements would go here. --> </service>
Dichiari la necessità di accedere alla posizione in primo piano quando la tua app richiede l'autorizzazione
ACCESS_COARSE_LOCATION
o l'autorizzazione
ACCESS_FINE_LOCATION
, come mostrato nel seguente snippet:
<manifest ... > <!-- Always include this permission --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- Include only if your app benefits from precise location access. --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> </manifest>
Posizione in background
Un'app richiede l'accesso alla posizione in background se una funzionalità al suo interno condivide costantemente la posizione con altri utenti o utilizza l'API Geofencing. Ecco alcuni esempi:
- All'interno di un'app di condivisione della posizione di gruppo Famiglia, una funzionalità consente agli utenti di condividere continuamente la posizione con i membri del gruppo Famiglia.
- All'interno di un'app IoT, una funzionalità consente agli utenti di configurare i dispositivi di casa in modo che si spengano quando l'utente esce di casa e si riaccendano quando rientra.
Il sistema considera che la tua app utilizzi la posizione in background se accede alla posizione corrente del dispositivo in qualsiasi situazione diversa da quelle descritte nella sezione Posizione in primo piano. La precisione della posizione in background è uguale alla precisione della posizione in primo piano, che dipende dalle autorizzazioni di accesso alla posizione dichiarate dalla tua app.
Su Android 10 (livello API 29) e versioni successive, devi dichiarare l'autorizzazione
ACCESS_BACKGROUND_LOCATION
nel file manifest della tua app per richiedere l'accesso alla posizione in background in fase di runtime. Nelle versioni precedenti di Android, quando l'app riceve l'accesso alla posizione in primo piano, riceve automaticamente anche l'accesso alla posizione in background.
<manifest ... > <!-- Required only when requesting background location access on Android 10 (API level 29) and higher. --> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" /> </manifest>
Precisione
Android supporta i seguenti livelli di precisione della posizione:
- Approssimativa
- Fornisce una stima della posizione del dispositivo. Se questa stima della posizione proviene da
LocationManagerService
oFusedLocationProvider
, è accurata entro circa 3 chilometri quadrati. La tua app può ricevere posizioni con questo livello di precisione se dichiari l'autorizzazioneACCESS_COARSE_LOCATION
, ma non l'autorizzazioneACCESS_FINE_LOCATION
. - Esatta
- Fornisce una stima della posizione del dispositivo il più accurata possibile. Se la stima della posizione è di
LocationManagerService
oFusedLocationProvider
, solitamente è compresa in un raggio di circa 50 metri e a volte è accurata fino a pochi metri. La tua app può ricevere posizioni con questo livello di precisione quando dichiari l'autorizzazioneACCESS_FINE_LOCATION
.
Se l'utente concede l'autorizzazione di accesso alla posizione approssimativa, la tua app ha accesso solo alla posizione approssimativa, indipendentemente dalle autorizzazioni di accesso alla posizione dichiarate dall'app.
La tua app dovrebbe comunque funzionare quando l'utente concede l'accesso alla posizione solo approssimativa. Se una funzionalità della tua app richiede assolutamente l'accesso alla posizione esatta utilizzando l'autorizzazione ACCESS_FINE_LOCATION
, puoi chiedere all'utente di consentire alla tua app di accedere alla posizione esatta.
Richiedere l'accesso alla posizione in fase di esecuzione
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 in 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à di "condivisione della 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 informazioni sulla posizione approssimative, anche quando la tua app richiede l'autorizzazione di runtime ACCESS_FINE_LOCATION
.
Per gestire questo potenziale comportamento dell'utente, non richiedere l'autorizzazione ACCESS_FINE_LOCATION
da sola. Richiedi invece sia l'autorizzazione ACCESS_FINE_LOCATION
che l'autorizzazione
ACCESS_COARSE_LOCATION
in una singola richiesta di runtime. Se provi a richiedere solo
ACCESS_FINE_LOCATION
, il sistema ignora la richiesta su 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:
- Precisa: consente all'app di ottenere informazioni precise sulla posizione.
- Approssimativa: consente all'app di ottenere solo informazioni sulla posizione approssimativa.
La Figura 3 mostra che la finestra di dialogo contiene un indicazione visiva per entrambe le opzioni, per aiutare l'utente a scegliere. Dopo che l'utente ha scelto una 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 di destinazione dell'app. Ciò vale anche quando la tua 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.
La scelta dell'utente influisce sulle concessioni delle autorizzazioni
La tabella seguente mostra le autorizzazioni concesse dalla piattaforma alla tua app, in base alle opzioni scelte dall'utente nella finestra di dialogo delle autorizzazioni di runtime:
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 alla tua app dal sistema, controlla il valore restituito della richiesta di autorizzazione. Puoi utilizzare le librerie Jetpack in un codice simile al seguente oppure puoi utilizzare le librerie della piattaforma, in cui gestisci autonomamente il codice di richiesta di autorizzazione.
Kotlin
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. locationPermissionRequest.launch(arrayOf( Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION))
Java
ActivityResultLauncher<String[]> locationPermissionRequest = registerForActivityResult(new ActivityResultContracts .RequestMultiplePermissions(), result -> { Boolean fineLocationGranted = result.getOrDefault( Manifest.permission.ACCESS_FINE_LOCATION, false); Boolean 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 });
Richiedere un upgrade alla posizione esatta
Puoi chiedere all'utente di eseguire l'upgrade dell'accesso della tua app dalla posizione approssimativa alla posizione precisa. Tuttavia, 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, ti consigliamo 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 approssimativo a preciso:
- Se necessario, spiega il motivo per cui la tua app ha bisogno dell'autorizzazione.
- Richiedi di nuovo le autorizzazioni
ACCESS_FINE_LOCATION
eACCESS_COARSE_LOCATION
. Poiché l'utente ha già consentito al sistema di concedere la posizione approssimativa alla tua app, questa volta la finestra di dialogo di sistema è diversa, 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 queste richiedano l'accesso alla posizione in background. Pertanto, è consigliabile che la tua app esegua 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. Se esegui 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 app progettata per gestire richieste incrementali. Sia la funzionalità "Mostra posizione attuale" sia la funzionalità "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 indirizzare gli utenti alle funzionalità che richiedono l'accesso alla posizione in primo piano, ad esempio la funzionalità "Condividi posizione" nella Figura 1 o la funzionalità "Mostra posizione attuale" nella Figura 2.
Ti consigliamo di disattivare l'accesso utente alle funzionalità che richiedono l'accesso alla posizione in background finché la tua app non avrà accesso alla posizione in primo piano.
-
In un secondo momento, quando l'utente esplora una funzionalità che richiede l'accesso alla posizione in background, puoi richiedere l'accesso alla posizione in background.
Richiedi la posizione in background, se necessario
I contenuti della finestra di dialogo delle autorizzazioni dipendono dalla versione dell'SDK target
Quando una funzionalità della tua app richiede l'accesso alla posizione in background su un dispositivo con Android 10 (livello API 29), la finestra di dialogo delle autorizzazioni di sistema include un'opzione denominata Consenti sempre. Se l'utente seleziona questa opzione, la funzionalità della tua app ottiene l'accesso alla posizione in background.
Su Android 11 (livello API 30) e versioni successive, tuttavia, la finestra di dialogo di sistema non include l'opzione Consenti sempre. Gli utenti devono invece attivare la localizzazione in background in una pagina delle impostazioni, come mostrato nella Figura 7.
Puoi aiutare gli utenti ad accedere a questa pagina delle impostazioni seguendo le best practice quando richiedi l'autorizzazione di accesso alla posizione in background. La procedura per concedere l'autorizzazione dipende dalla versione dell'SDK di destinazione dell'app.
L'app ha come target Android 11 o versioni successive
Se alla tua app non è stata concessa l'autorizzazione ACCESS_BACKGROUND_LOCATION
e shouldShowRequestPermissionRationale()
restituisce true
, mostra agli utenti un'interfaccia utente informativa che includa quanto segue:
- Una spiegazione chiara del motivo per cui la funzionalità della tua app ha bisogno di accedere alla posizione in background.
- L'etichetta visibile all'utente dell'opzione di impostazioni che concede l'accesso alla posizione in background
(ad esempio Consenti sempre nella figura 7). Puoi chiamare
getBackgroundPermissionOptionLabel()
per ottenere questa etichetta. Il valore restituito da questo metodo è localizzato in base alle preferenze di lingua del dispositivo dell'utente. - Un'opzione per consentire agli utenti di rifiutare l'autorizzazione. Se gli utenti rifiutano l'accesso alla posizione in background, dovrebbero essere in grado di continuare a utilizzare la tua app.
L'app ha come target Android 10 o versioni precedenti
Quando una funzionalità della tua app richiede l'accesso alla posizione in background, gli utenti visualizzano una finestra di dialogo di sistema. Questa finestra di dialogo include un'opzione per accedere alle opzioni di autorizzazione di accesso alla posizione della tua app in una pagina delle impostazioni.
Se la tua app segue già le best practice per la richiesta delle autorizzazioni di accesso alla posizione, non devi apportare modifiche per supportare questo comportamento.
L'utente può influire sulla precisione della posizione in background
Se l'utente richiede la posizione approssimativa, le sue scelte nella finestra di dialogo delle autorizzazioni di accesso alla posizione si applicano anche alla posizione in background. In altre parole, se l'utente concede alla tua app l'autorizzazione ACCESS_BACKGROUND_LOCATION
, ma solo per l'accesso alla posizione approssimativa in primo piano, la tua app avrà accesso alla posizione approssimativa anche in background.
Promemoria relativo alla concessione dell'accesso alla posizione in background
Su Android 10 e versioni successive, quando una funzionalità della tua app accede alla posizione del dispositivo in background per la prima volta dopo che l'utente ha concesso l'accesso alla posizione in background, il sistema pianifica l'invio di una notifica all'utente. Questa notifica ricorda all'utente che ha consentito alla tua app di accedere alla posizione del dispositivo sempre. Nella figura 8 è riportata una notifica di esempio.
Verificare la presenza di requisiti relativi alla posizione nelle dipendenze dell'SDK dell'app
Controlla se la tua app utilizza SDK che dipendono dalle autorizzazioni di accesso alla posizione, in particolare l'autorizzazione ACCESS_FINE_LOCATION
. Consulta questo articolo su Medium su come comprendere il comportamento delle dipendenze SDK.
Risorse aggiuntive
Per ulteriori informazioni sulle autorizzazioni di accesso alla posizione in Android, consulta i seguenti materiali:
Codelab
Video
Campioni
- App di esempio per dimostrare l'utilizzo delle autorizzazioni di accesso alla posizione.