Richiedere autorizzazioni speciali

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 di installazione e dalle autorizzazioni di runtime.

La schermata "Accesso speciale per le app" delle impostazioni di sistema di Android, che mostra un elenco di app e i relativi stati di autorizzazione speciali.
Figura 1. La schermata Accesso speciale per le app nelle impostazioni di sistema.

Ecco alcuni esempi di autorizzazioni speciali:

  • Pianificazione 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 alla pagina: Impostazioni > App > Accesso speciale per le app.

Flusso di lavoro

Per richiedere un'autorizzazione speciale:

  1. Nel file manifest della tua app, dichiara le autorizzazioni speciali che la tua app potrebbe dover richiedere.
  2. Progetta l'esperienza utente (UX) della tua app in modo che azioni specifiche nell'app siano associate ad autorizzazioni speciali specifiche. Informa gli utenti di quali azioni potrebbero richiedere loro di concedere l'autorizzazione alla tua app per accedere ai dati utente privati.
  3. Attendi che l'utente richiami l'attività o l'azione nella tua app che richiede l'accesso a dati utente privati specifici. A questo punto, la tua app può richiedere l'autorizzazione speciale necessaria per accedere a questi dati.
  4. Verifica 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 è stata concessa, la tua app può accedere ai dati utente privati. In caso contrario, vai al passaggio successivo. Nota: devi verificare se disponi dell'autorizzazione ogni volta che esegui un'operazione che la richiede.
  5. Presenta all'utente una motivazione in un elemento dell'interfaccia utente che spieghi chiaramente a quali dati la tua app sta tentando di accedere e quali vantaggi può offrire a l'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 queste impostazioni. L'interfaccia utente della motivazione deve fornire all'utente un'opzione chiara per disattivare la concessione dell'autorizzazione. Dopo che l'utente ha riconosciuto la motivazione, continua al passaggio successivo.
  6. Richiedi l'autorizzazione speciale necessaria alla tua app per accedere ai dati utente privati. In genere, questa operazione 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.
  7. Controlla la risposta dell'utente (se ha scelto di concedere o negare l'autorizzazione speciale) nel metodo onResume().
  8. Se l'utente ha concesso l'autorizzazione alla tua app, puoi accedere ai dati utente privati. Se 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.
Diagramma che illustra il flusso di lavoro per dichiarare e richiedere autorizzazioni speciali su Android, dalla dichiarazione del manifest alla motivazione dell'utente, al reindirizzamento alle impostazioni di sistema e alla gestione della decisione dell'utente.
Figura 2. Flusso di lavoro per dichiarare e richiedere autorizzazioni speciali su Android.

Richiedere autorizzazioni speciali

A differenza delle autorizzazioni di runtime, l'utente deve concedere le autorizzazioni speciali da la pagina Accesso speciale per le app nelle impostazioni di sistema. Le app possono indirizzare 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. Dopo che l'utente torna all'app, questa può verificare se l'autorizzazione è stata concessa nella funzione onResume().

Il seguente codice di esempio mostra come richiedere l' SCHEDULE_EXACT_ALARMS autorizzazione speciale 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 di esempio 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 seguenti sezioni forniscono considerazioni e suggerimenti per la richiesta di autorizzazioni speciali.

Ogni autorizzazione ha un proprio metodo di controllo

Le autorizzazioni speciali funzionano in modo diverso rispetto alle autorizzazioni di runtime. Fai riferimento alla pagina di riferimento dell'API delle autorizzazioni e utilizza le funzioni di controllo dell'accesso personalizzate per ogni autorizzazione speciale. Ad esempio, AlarmManager#canScheduleExactAlarms() per l' SCHEDULE_EXACT_ALARMS e Environment#isExternalStorageManager() per l' MANAGE_EXTERNAL_STORAGE.

Richiedere nel contesto

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 a un'ora specifica.

Spiegare la richiesta

Fornisci una motivazione prima di reindirizzare alle impostazioni di sistema. Poiché gli utenti escono temporaneamente dall' app per concedere autorizzazioni speciali, mostra un'interfaccia utente in-app prima di avviare l'intent alla pagina Accesso speciale per le app nelle impostazioni di sistema. Questa interfaccia utente deve spiegare chiaramente perché l'app ha bisogno dell'autorizzazione e come l'utente deve concederla nella pagina delle impostazioni.