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 al momento dell'installazione e dalle autorizzazioni di runtime.

Figura 1: la schermata Accesso speciale per le app nelle impostazioni di sistema.

Alcuni esempi di autorizzazioni speciali includono:

  • Programmazione di sveglie esatte.
  • Visualizzazione e disegno su altre app.
  • Accesso a tutti i dati di archiviazione.

Le app che dichiarano un'autorizzazione speciale vengono mostrate nella pagina Accesso speciale per le app nelle impostazioni di sistema (Figura 1). Per concedere un'autorizzazione speciale all'app, l'utente deve accedere a questa pagina: Impostazioni > App > Accesso speciale per le app.

Flusso di lavoro

Per richiedere un'autorizzazione speciale:

  1. Nel file manifest dell'app, dichiara le autorizzazioni speciali che l'app potrebbe dover richiedere.
  2. Progetta l'esperienza utente della tua app in modo che azioni specifiche al suo interno siano associate a determinate autorizzazioni speciali. Fai sapere agli utenti 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 privati specifici dell'utente. In quel momento, la tua app può richiedere l'autorizzazione speciale necessaria per accedere a questi dati.
  4. Controlla se l'utente ha già concesso l'autorizzazione speciale richiesta dalla tua app. Per farlo, utilizza la funzione di controllo personalizzata di ciascuna autorizzazione. Se concesso, 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 una motivazione all'utente in un elemento UI che spieghi chiaramente a quali dati l'app sta tentando di accedere e quali vantaggi può offrire all'utente se concede l'autorizzazione speciale. Inoltre, dal momento che la tua app invia gli utenti alle impostazioni di sistema per concedere l'autorizzazione, include anche brevi istruzioni che spiegano come gli utenti possono concedere l'autorizzazione lì. La UI logica deve fornire all'utente un'opzione chiara per rinunciare alla concessione dell'autorizzazione. Dopo che l'utente conferma la logica, vai al passaggio successivo.
  6. Richiedi l'autorizzazione speciale necessaria alla tua app per accedere ai dati utente privati. Probabilmente questo comporta un intent per la pagina corrispondente nelle impostazioni di sistema in cui l'utente può concedere l'autorizzazione. A differenza delle autorizzazioni di runtime, non è presente una finestra di dialogo delle autorizzazioni popup.
  7. Controlla la risposta dell'utente, che abbia 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 invece l'utente ha negato l'autorizzazione, riduci in modo corretto l'esperienza con l'app in modo che fornisca funzionalità all'utente senza le informazioni protette da tale autorizzazione.
Figura 2: flusso di lavoro per la dichiarazione e la richiesta di autorizzazioni speciali su Android.

Richiedi autorizzazioni speciali

A differenza delle autorizzazioni di runtime, l'utente deve concedere autorizzazioni speciali nella pagina Accesso speciale alle 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, quest'ultima può verificare se l'autorizzazione è stata concessa nella funzione onResume().

Il seguente codice di esempio 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 verificare 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 seguenti sezioni forniscono alcune best practice e considerazioni per la richiesta di autorizzazioni speciali.

Ogni autorizzazione ha il proprio metodo di controllo

Le autorizzazioni speciali operano in modo diverso rispetto alle autorizzazioni di runtime. Consulta invece la pagina di riferimento dell'API Authorization e utilizza le funzioni di controllo dell'accesso personalizzato 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 nel contesto

Analogamente alle autorizzazioni di runtime, le app devono richiedere autorizzazioni speciali contestualmente 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 orario specifico.

Spiega la richiesta

Fornisci una motivazione prima di eseguire il reindirizzamento alle impostazioni di sistema. Poiché gli utenti abbandonano temporaneamente l'app per concedere autorizzazioni speciali, mostra un'interfaccia utente in-app prima di avviare l'intent nella 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.