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 per il 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 sono mostrate 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:

  1. Nel file manifest dell'app, dichiara le autorizzazioni speciali che l'app potrebbe dover richiedere.
  2. Progetta l'UX dell'app in modo che determinate azioni nell'app siano associate ad autorizzazioni speciali specifiche. Fai sapere agli utenti quali azioni potrebbero richiedere alla tua app l'autorizzazione ad accedere ai dati utente privati.
  3. Attendi che l'utente richiami l'attività o l'azione nella tua app che richiede l'accesso a specifici dati privati dell'utente. A quel punto, l'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. A questo scopo, utilizza la funzione di controllo personalizzata di ciascuna autorizzazione. Se concesso, l'app può accedere ai dati utente privati. In caso contrario, vai al passaggio successivo. Nota: devi verificare di avere l'autorizzazione ogni volta che esegui un'operazione che richiede l'autorizzazione.
  5. Presenta una motivazione all'utente in un elemento UI che spieghi chiaramente a quali dati sta cercando di accedere la tua app e quali vantaggi può offrire all'utente se concede l'autorizzazione speciale. Inoltre, dal momento che la tua app indirizza gli utenti alle impostazioni di sistema per concedere l'autorizzazione, includi anche brevi istruzioni che spiegano in che modo gli utenti possono concedere l'autorizzazione in questa posizione. La UI logica dovrebbe fornire un'opzione chiara per consentire all'utente di disattivare la concessione dell'autorizzazione. Dopo che l'utente conferma il razionale, vai al passaggio successivo.
  6. Richiedi l'autorizzazione speciale richiesta dalla tua app per accedere ai dati privati dell'utente. Ciò probabilmente riguarda 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 di autorizzazione popup.
  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 invece negato l'autorizzazione, riduci automaticamente l'esperienza con la tua app in modo che forni all'utente funzionalità 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 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 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 sezioni seguenti 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 per le autorizzazioni e utilizza le funzioni personalizzate di controllo degli accessi 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 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 fino a quando l'utente non pianifica 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 abbandonano temporaneamente l'app per concedere autorizzazioni speciali, mostra un'interfaccia utente in-app prima di avviare l'intent nella pagina Accesso speciale alle app nelle impostazioni di sistema. Questa UI deve spiegare chiaramente perché l'app richiede l'autorizzazione e come l'utente dovrebbe concederla nella pagina delle impostazioni.