Per proteggere la privacy degli utenti, le app che usano i servizi di geolocalizzazione devono richiedere la posizione autorizzazioni aggiuntive.
Quando richiedi le autorizzazioni di accesso alla posizione, segui le stesse best practice per qualsiasi altra autorizzazione di runtime. Una differenza importante per quanto riguarda le autorizzazioni di accesso alla posizione è che include più autorizzazioni relative alla posizione. Quali autorizzazioni richiesta e dalle modalità di richiesta, dipendono dai requisiti per le località in base al caso d'uso dell'app.
Questa pagina descrive i diversi tipi di requisiti per le località e fornisce indicazioni su come richiedere le autorizzazioni di accesso alla posizione in ciascun caso.
Tipi di accesso alla posizione
Ogni autorizzazione presenta una combinazione delle seguenti caratteristiche:
- Categoria: posizione in primo piano o in background posizione.
- Accuratezza: posizione esatta o posizione approssimativa.
Posizione in primo piano
Se la tua app contiene una funzionalità che condivide o riceve soltanto informazioni sulla posizione una volta o per un periodo di tempo definito, la funzionalità richiede in primo piano accesso alla posizione. Ecco alcuni esempi:
- All'interno di un'app di navigazione, una funzionalità consente agli utenti di ricevere indicazioni passo passo indicazioni stradali.
- All'interno di un'app di messaggistica, una funzionalità consente agli utenti di condividere la loro posizione attuale con un altro utente.
Il sistema considera che la tua app utilizzi la posizione in primo piano se una funzionalità di l'app accede alla posizione attuale del dispositivo in uno dei seguenti modi situazioni seguenti:
- Un'attività appartenente alla tua app è visibile.
La tua app esegue un servizio in primo piano. Quando un servizio in primo piano viene il sistema aumenta la consapevolezza degli utenti mostrando una notifica persistente. L'app mantiene l'accesso quando viene posizionata in background, ad esempio quando: l'utente preme il pulsante Home sul proprio dispositivo o ruota il display del dispositivo disattivata.
Inoltre, è consigliabile dichiarare un servizio in primo piano tipo di
location
, come mostrato nel seguente snippet di codice. Su Android 10 (API livello 29) e successivi, 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à della posizione in primo piano quando la tua app richiede
ACCESS_COARSE_LOCATION
autorizzazione o
ACCESS_FINE_LOCATION
come mostrato nello snippet seguente:
<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à all'interno dell'app condivide costantemente la posizione con altri utenti o utilizza il geofencing tramite Google Cloud. Ecco alcuni esempi:
- All'interno di un'app di condivisione della posizione per la famiglia, una funzione consente agli utenti di condividere la posizione con i membri del gruppo Famiglia.
- All'interno di un'app IoT, una funzionalità consente agli utenti di configurare i dispositivi per la casa, che disattivino quando l'utente esce di casa e si riaccendano quando l'utente torna alla home page.
Il sistema considera l'app di utilizzare la posizione in background se accede al la posizione attuale del dispositivo in qualsiasi situazione diversa da quella descritta nei posizione in primo piano. La precisione della posizione in background è equivale alla precisione della posizione in primo piano, che dipende Le autorizzazioni di accesso alla posizione dichiarate dalla tua app.
Su Android 10 (livello API 29) e versioni successive, devi dichiarare
ACCESS_BACKGROUND_LOCATION
autorizzazione nel file manifest dell'app per richiedere la posizione in background
di accesso in fase di runtime. Nelle versioni precedenti di
Android, quando la tua app riceve l'accesso alla posizione in primo piano,
riceve 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>
Accuratezza
Android supporta i seguenti livelli di precisione della geolocalizzazione:
- Approssimativa
- Fornisce una stima della posizione del dispositivo. Se la stima della posizione proviene dal
LocationManagerService
oFusedLocationProvider
, questa stima è precisa entro circa 3 chilometri quadrati (circa 1,2 chilometri). La tua app può ricevere posizioni a questo livello di precisione quando dichiara l'autorizzazioneACCESS_COARSE_LOCATION
, ma non AutorizzazioneACCESS_FINE_LOCATION
. - Esatta
- Fornisce una stima della posizione del dispositivo più precisa possibile. Se
stima della posizione è di
LocationManagerService
oFusedLocationProvider
, questa stima è solitamente entro circa 50 metri (160 piedi) e a volte è con una precisione di pochi metri (10 piedi) o migliore. La tua app può ricevere località a questo livello di precisione quando dichiariACCESS_FINE_LOCATION
autorizzazione.
Se l'utente concede l'autorizzazione di accesso alla posizione approssimativa, l'app ha accesso soltanto alla posizione approssimativa, indipendentemente dalla posizione le autorizzazioni dichiarate dalla tua app.
L'app dovrebbe continuare a funzionare se l'utente concede solo la posizione approssimativa.
l'accesso. Se una funzionalità della tua app richiede assolutamente l'accesso alla posizione esatta
usando l'autorizzazione ACCESS_FINE_LOCATION
, puoi chiedere all'utente di consentire i tuoi
per accedere alla posizione esatta.
Richiedi l'accesso alla posizione in fase di runtime
Quando una funzionalità dell'app ha bisogno di accedere alla posizione, attendi che l'utente interagisca con la funzionalità prima di effettuare la richiesta di autorizzazione. Questo flusso di lavoro segue best practice per chiedere le autorizzazioni di runtime nel contesto, come descritto in che spiega come richiedere un'app autorizzazioni.
La figura 1 mostra un esempio di come eseguire questo processo. L'app contiene un "condividi posizione" che richiede l'accesso alla posizione in primo piano. L'app ma non richiede l'autorizzazione di accesso alla posizione finché l'utente non seleziona Pulsante Condividi posizione.
L'utente può concedere solo la posizione approssimativa
Su Android 12 (livello API 31) o versioni successive, gli utenti possono richiedere il recupero dell'app
solo dati sulla posizione approssimativa, anche quando la tua app richiede
ACCESS_FINE_LOCATION
l'autorizzazione di runtime.
Per gestire questo potenziale comportamento degli utenti, non richiedere l'autorizzazione ACCESS_FINE_LOCATION
l'autorizzazione. Richiedi invece sia ACCESS_FINE_LOCATION
autorizzazione e
ACCESS_COARSE_LOCATION
in una singola 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
successiva, il sistema registra il seguente messaggio di errore
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 elemento visivo segnale per entrambe le opzioni, per aiutare l'utente a scegliere. Dopo che l'utente decide precisione della posizione, tocca uno dei tre pulsanti per selezionare la durata la 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 dal versione SDK target. Ciò vale anche quando l'app è installata su un dispositivo. con Android 11 o versioni precedenti, quindi l'utente esegue l'upgrade dispositivo ad Android 12 o versioni successive.
ACCESS_COARSE_LOCATION
.ACCESS_FINE_LOCATION
che
ACCESS_COARSE_LOCATION
in una singola richiesta di runtime.
La scelta dell'utente influisce sulle concessioni di autorizzazioni
La tabella seguente mostra le autorizzazioni concesse alla tua app dal sistema. in base alle opzioni scelte dall'utente nella finestra di dialogo del 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 ha concesso il sistema alla tua app, controlla le che restituisca un valore della richiesta di autorizzazioni. Puoi utilizzare le librerie Jetpack nel codice simile a quello riportato di seguito oppure puoi usare le librerie di piattaforma per gestire il codice della richiesta di autorizzazione autonomamente.
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 });
Richiedi un upgrade alla posizione esatta
Puoi chiedere all'utente di eseguire l'upgrade dell'accesso alla tua app dalla posizione approssimativa a
posizione esatta. Prima di chiedere all'utente di eseguire l'upgrade dell'accesso della tua app a
posizione esatta, tuttavia, valuta se il caso d'uso della tua app
richiede questo livello di precisione. Se la tua app deve accoppiare un dispositivo con nelle vicinanze
di dispositivi tramite Bluetooth o Wi-Fi, valuta la possibilità di utilizzare dispositivi associati
accoppiamento o Bluetooth
autorizzazioni, anziché
richiedendo l'autorizzazione ACCESS_FINE_LOCATION
.
Per richiedere all'utente di eseguire l'upgrade dell'accesso alla posizione dell'app da approssimativa a precise, procedi nel seguente modo:
- Se necessario, spiega perché la tua app ha bisogno del autorizzazione.
- Richiedi le autorizzazioni
ACCESS_FINE_LOCATION
eACCESS_COARSE_LOCATION
di nuovo insieme. Poiché l'utente ha già consentito al sistema di concedere posizione approssimativa rispetto alla tua app, questa volta la finestra di dialogo di sistema è diversa, mostrata nella Figura 4 e 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 alcuni richiedono l'accesso alla posizione in background. Pertanto, È consigliabile che la tua app esegua richieste incrementali per la posizione autorizzazioni, chiedendo l'accesso alla posizione in primo piano e poi alla posizione in background l'accesso. Eseguendo richieste incrementali, offri agli utenti un maggiore controllo perché possono capire meglio quali funzionalità della tua app servono accesso alla posizione in background.
La figura 6 mostra un esempio di app progettata per gestire richieste. Entrambe le opzioni "Mostra posizione corrente" e "consiglia luoghi nelle vicinanze" funzionalità richiedono l'accesso alla posizione in primo piano. Solo l'opzione "Consiglia luoghi nelle vicinanze" richiede tuttavia l'accesso alla posizione in background.
La procedura per eseguire le richieste incrementali è la seguente:
-
Inizialmente, l'app deve indirizzare gli utenti verso le funzionalità che richiedono Accesso alla posizione in primo piano, ad esempio "condividi posizione" caratteristica nella Figura 1 o "mostra posizione attuale" nella Figura 2.
Ti consigliamo di disattivare l'accesso degli utenti alle funzionalità che richiedono accesso alla posizione in background finché l'app non ha la posizione in primo piano l'accesso.
-
In un secondo momento, quando l'utente esplora una funzionalità che richiede l'accesso alla posizione in background, puoi richiedere posizione in background l'accesso.
Richiedi la posizione in background, se necessario
I contenuti della finestra di dialogo delle autorizzazioni dipendono dalla versione dell'SDK target
Quando una funzionalità dell'app richiede la posizione in background su un dispositivo in esecuzione 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à in la tua app ottiene l'accesso alla posizione in background.
Su Android 11 (livello API 30) e versioni successive, tuttavia, la finestra di dialogo del sistema includi l'opzione Consenti sempre. Gli utenti devono invece attivare la modalità in background su una pagina delle impostazioni, come mostrato nella figura 7.
Puoi aiutare gli utenti a raggiungere questa pagina delle impostazioni seguendo le best practice per richiedere l'autorizzazione di accesso alla posizione in background. La procedura per concedere ai dipende dalla versione dell'SDK target della tua 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 include quanto segue:
- Una spiegazione chiara del motivo per cui la funzionalità dell'app richiede l'accesso allo sfondo in ogni località.
- L'etichetta visibile dall'utente dell'opzione delle impostazioni che concede la posizione in background
ad esempio, Consenti sempre nella figura 7. Puoi chiamare
getBackgroundPermissionOptionLabel()
per ottenere questa etichetta. Il valore restituito di questo metodo è localizzato nella preferenza lingua del dispositivo. - Un'opzione che consente agli utenti di rifiutare l'autorizzazione. Se gli utenti rifiutano lo sfondo accesso alla posizione, dovrebbe essere in grado di continuare a utilizzare la tua app.
L'app ha come target Android 10 o versioni precedenti
Quando una funzionalità dell'app richiede l'accesso alla posizione in background, gli utenti vedono una finestra di dialogo di sistema. Questa finestra di dialogo include un'opzione per raggiungere la posizione della tua app opzioni relative alle autorizzazioni nella pagina delle impostazioni.
A condizione che la tua app rispetti già le best practice per richiedere la posizione autorizzazioni, non è necessario apportare modifiche per supportare questo comportamento.
L'utente può influire sulla precisione della posizione in background
Se l'utente richiede la posizione approssimativa, l'
le scelte nella finestra di dialogo delle autorizzazioni di accesso alla posizione si applicano anche alla posizione in background. Nella
In altre parole, se l'utente concede alla tua app ACCESS_BACKGROUND_LOCATION
ma concede solo l'accesso alla posizione approssimativa in primo piano, i tuoi
anche l'app ha solo accesso alla posizione approssimativa in background.
Promemoria per la concessione della posizione in background
Su Android 10 e versioni successive, quando una funzionalità dell'app accede alla posizione del dispositivo in lo sfondo per la prima volta dopo che l'utente ha concesso la posizione in background l'accesso, il sistema pianifica l'invio di una notifica all'utente. Questo notifica ricorda all'utente che ha consentito alla tua app di accedere al dispositivo posizione. Nella figura 8 viene visualizzata una notifica di esempio.
Verifica i requisiti per le località 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 conoscere i comportamenti degli SDK
delle dipendenze.
Risorse aggiuntive
Per ulteriori informazioni sulle autorizzazioni di accesso alla posizione in Android, consulta le seguenti risorse materiali:
Codelab
Video
Campioni
- App di esempio per dimostrare l'utilizzo delle autorizzazioni di accesso alla posizione.