Un'autorizzazione speciale protegge l'accesso alle risorse di sistema particolarmente sensibili o non direttamente correlate alla privacy dell'utente. Queste autorizzazioni sono diverse dalle autorizzazioni in fase di installazione e dalle autorizzazioni di runtime.
Alcuni esempi di autorizzazioni speciali includono:
- Programmazione di sveglie esatte.
- Visualizzazione e disegno sopra altre app.
- Accesso a tutti i dati di archiviazione.
Le app che dichiarano un'autorizzazione speciale vengono visualizzate nella pagina Accesso speciale per le app nelle impostazioni di sistema (figura 1). Per concedere un'autorizzazione speciale all'app, un utente deve andare a questa pagina: Impostazioni > App > Accesso speciale per le app.
Flusso di lavoro
Per richiedere un'autorizzazione speciale:
- Nel file manifest della tua app, dichiara le autorizzazioni speciali che la tua app potrebbe dover richiedere.
- Progetta l'esperienza utente della tua app in modo che azioni specifiche nell'app siano associate ad autorizzazioni speciali specifiche. Comunica agli utenti quali azioni potrebbero richiedere loro di concedere l'autorizzazione alla tua app per accedere ai dati privati degli utenti.
- Attendi che l'utente richiami l'attività o l'azione nella tua app che richiede l'accesso a dati utente privati specifici. A quel punto, la tua app può richiedere l'autorizzazione speciale necessaria per accedere a questi dati.
- Verifica se l'utente ha già concesso l'autorizzazione speciale richiesta dalla tua app. Per farlo, utilizza la funzione di controllo personalizzato di ogni autorizzazione. Se concessa, la tua app può accedere ai dati privati dell'utente. In caso contrario, vai al passaggio successivo. Nota: devi verificare di disporre dell'autorizzazione ogni volta che esegui un'operazione che la richiede.
- Presenta una motivazione all'utente in un elemento UI che spieghi chiaramente a quali dati la tua app sta tentando di accedere e quali vantaggi può offrire all'utente se concede l'autorizzazione speciale. Inoltre, poiché la tua app indirizza gli utenti alle impostazioni di sistema per concedere l'autorizzazione, includi anche brevi istruzioni che spiegano come gli utenti possono concedere l'autorizzazione in questa sezione. L'interfaccia utente della motivazione deve fornire all'utente un'opzione chiara per disattivare la concessione dell'autorizzazione. Dopo che l'utente ha preso atto della motivazione, vai al passaggio successivo.
- Richiedi l'autorizzazione speciale necessaria alla tua app per accedere ai dati privati dell'utente. Probabilmente si tratta di un intento per la pagina corrispondente nelle impostazioni di sistema in cui l'utente può concedere l'autorizzazione. A differenza delle autorizzazioni di runtime, non esiste una finestra di dialogo popup per le autorizzazioni.
- Controlla la risposta dell'utente, ovvero se ha scelto di concedere o negare l'autorizzazione speciale, nel metodo
onResume()
. - Se l'utente ha concesso l'autorizzazione alla tua app, puoi accedere ai dati privati dell'utente. Se invece l'utente ha negato l'autorizzazione, riduci gradualmente l'esperienza della tua app in modo che fornisca funzionalità all'utente senza le informazioni protette da questa autorizzazione.
Richiedere autorizzazioni speciali
A differenza delle autorizzazioni di runtime, l'utente deve concedere autorizzazioni speciali dalla pagina Accesso speciale per le app nelle impostazioni di sistema. Le app possono inviare gli utenti a questa pagina utilizzando un intent, che mette in pausa l'app
e avvia la pagina delle impostazioni corrispondente per una determinata autorizzazione speciale.
Quando l'utente torna all'app, questa può controllare se l'autorizzazione è stata
concessa nella funzione onResume()
.
Il seguente esempio di codice mostra come richiedere l'autorizzazione speciale
SCHEDULE_EXACT_ALARMS
agli utenti:
val alarmManager = getSystemService<AlarmManager>()!!
when {
// if permission is granted, proceed with scheduling exact alarms…
alarmManager.canScheduleExactAlarms() -> {
alarmManager.setExact(...)
}
else -> {
// ask users to grant the permission in the corresponding settings page
startActivity(Intent(ACTION_REQUEST_SCHEDULE_EXACT_ALARM))
}
}
Esempio di codice per controllare l'autorizzazione e gestire le decisioni degli utenti in onResume()
:
override fun onResume() {
// ...
if (alarmManager.canScheduleExactAlarms()) {
// proceed with the action (setting exact alarms)
alarmManager.setExact(...)
}
else {
// permission not yet approved. Display user notice and gracefully degrade
your app experience.
alarmManager.setWindow(...)
}
}
Best practice e suggerimenti
Le sezioni seguenti forniscono alcune best practice e considerazioni da tenere presenti quando richiedi autorizzazioni speciali.
Ogni autorizzazione ha un proprio metodo di controllo
Le autorizzazioni speciali funzionano in modo diverso dalle autorizzazioni
di runtime. Fai invece riferimento alla pagina di riferimento dell'API Permissions e utilizza le funzioni di controllo dell'accesso personalizzato per ogni autorizzazione speciale. Alcuni esempi includono
AlarmManager#canScheduleExactAlarms()
per l'autorizzazione
SCHEDULE_EXACT_ALARMS
e
Environment#isExternalStorageManager()
per l'autorizzazione
MANAGE_EXTERNAL_STORAGE
.
Richiesta in contesto
Analogamente alle autorizzazioni di runtime, le app devono richiedere autorizzazioni speciali
in-context quando l'utente richiede un'azione specifica che richiede l'autorizzazione. Ad esempio, attendi di richiedere l'autorizzazione SCHEDULE_EXACT_ALARMS
finché l'utente non programma l'invio di un'email a un orario specifico.
Spiega la richiesta
Fornisci una motivazione prima di reindirizzare alle impostazioni di sistema. Poiché gli utenti escono temporaneamente dall'app per concedere autorizzazioni speciali, mostra una UI in-app prima di avviare l'intent per la pagina Accesso speciale per le app nelle impostazioni di sistema. Questa UI deve spiegare chiaramente perché l'app ha bisogno dell'autorizzazione e come l'utente deve concederla nella pagina delle impostazioni.