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 al momento dell'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, l'utente deve andare alla pagina Impostazioni > App > Accesso speciale per le app.
Workflow
Per richiedere un'autorizzazione speciale, segui questi passaggi:
- Nel file manifest della tua app, dichiara le autorizzazioni speciali che la tua app potrebbe dover richiedere.
- Progetta l'esperienza utente (UX) della tua app in modo che azioni specifiche nell'app siano associate ad autorizzazioni speciali specifiche. Comunica agli utenti quali azioni potrebbero richiedere la concessione dell'autorizzazione per l'accesso ai dati utente privati da parte della tua app.
- Attendi che l'utente richiami l'attività o l'azione nella tua app che richiede l'accesso a dati utente privati specifici. In quel momento, l'app può richiedere l'autorizzazione speciale necessaria per accedere ai dati.
- Controlla se l'utente ha già concesso l'autorizzazione speciale richiesta dalla tua app. Per farlo, utilizza la funzione di controllo personalizzata di ogni autorizzazione. Se l'autorizzazione viene concessa, l'app può accedere ai dati utente privati. 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 spieghino come gli utenti possono concedere l'autorizzazione in questa sezione. La UI della motivazione deve fornire all'utente un'opzione chiara per disattivare la concessione dell'autorizzazione. Dopo che l'utente ha confermato la motivazione, vai al passaggio successivo.
- Richiedi l'autorizzazione speciale richiesta dalla tua app per accedere ai dati utente privati. Ciò probabilmente comporta un intent alla 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 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 utente privati. Se l'utente ha negato l'autorizzazione, applica la riduzione controllata per l'esperienza con l'app in modo che l'app fornisca funzionalità all'utente senza le informazioni protette da tale autorizzazione.
Richiedi 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 indirizzare gli utenti lì utilizzando un intent, che mette in pausa l'app e avvia la pagina delle impostazioni corrispondente per una determinata autorizzazione speciale. Dopo che l'utente torna all'app, l'app può verificare se l'autorizzazione è stata concessa nella funzione onResume().
Il seguente codice campione 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))
}
}
Codice campione 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(...)
}
}
Suggerimenti per richiedere autorizzazioni speciali
Le sezioni seguenti forniscono considerazioni e suggerimenti per la richiesta di autorizzazioni speciali.
Ogni autorizzazione ha il proprio metodo di controllo
Le autorizzazioni speciali funzionano in modo diverso rispetto alle autorizzazioni di runtime. Consulta invece la pagina di riferimento dell'API Permissions e utilizza le funzioni di controllo dell'accesso personalizzate per ogni autorizzazione speciale. Alcuni esempi sono AlarmManager#canScheduleExactAlarms() per l'autorizzazione SCHEDULE_EXACT_ALARMS e Environment#isExternalStorageManager() per l'autorizzazione MANAGE_EXTERNAL_STORAGE.
Richiesta contestuale
Analogamente alle autorizzazioni di runtime, le app devono richiedere autorizzazioni speciali nel contesto 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 pianifica l'invio di un'email in un momento specifico.
Spiega la richiesta
Fornisci una motivazione prima di reindirizzare l'utente alle impostazioni di sistema. Poiché gli utenti escono temporaneamente dall'app per concedere autorizzazioni speciali, mostra una UI in-app prima di lanciare l'intent alla 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.