Gestire tutti i file su un dispositivo di archiviazione

La maggior parte delle app che richiedono l'accesso allo spazio di archiviazione condiviso può seguire le best practice per la condivisione di file multimediali e la condivisione di file non multimediali. Tuttavia, alcune app hanno un caso d'uso principale che richiede un ampio accesso ai file su un dispositivo, ma non possono accedervi in modo efficiente utilizzando le best practice per l'archiviazione rispettosa della privacy. Per queste situazioni Android offre uno speciale accesso all'app chiamato accesso a tutti i file.

Ad esempio, il caso d'uso principale di un'app antivirus potrebbe richiedere la scansione regolare di molti file in directory diverse. Se questa analisi richiede interazioni ripetute da parte dell'utente per la selezione delle directory utilizzando il selettore file di sistema, l'esperienza utente non è ottimale. Altri casi d'uso, come le app di gestione di file, le app di backup e ripristino e le app di gestione dei documenti, richiedono considerazioni simili.

Richiedi l'accesso a tutti i file

Un'app può richiedere all'utente l'accesso a tutti i file nel seguente modo:

  1. Dichiara l'autorizzazione MANAGE_EXTERNAL_STORAGE nel file manifest.
  2. Utilizza l'azione di intent ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION per indirizzare gli utenti a una pagina delle impostazioni di sistema in cui possono attivare la seguente opzione per la tua app: Consenti l'accesso per gestire tutti i file.

Per determinare se alla tua app è stata concessa l'autorizzazione MANAGE_EXTERNAL_STORAGE, chiama Environment.isExternalStorageManager().

Operazioni consentite da MANAGE_EXTERNAL_STORAGE

L'autorizzazione MANAGE_EXTERNAL_STORAGE concede quanto segue:

  • Accesso in lettura e scrittura a tutti i file all'interno dello spazio di archiviazione condiviso.

  • Accesso ai contenuti della tabella MediaStore.Files.

  • Accesso alla directory radice dell'unità USB on-the-go (OTG) e della scheda SD.

  • Accesso in scrittura a tutte le directory di archiviazione interna⁠, ad eccezione di /Android/data/, /sdcard/Android e della maggior parte delle sottodirectory di /sdcard/Android. Questo accesso in scrittura include l'accesso direttamente al percorso file.

    Le app a cui viene concessa questa autorizzazione non possono comunque accedere alle directory specifiche dell'app che appartengono ad altre app, perché vengono visualizzate come sottodirectory di Android/data/ su un volume di archiviazione.

Se un'app dispone dell'autorizzazione MANAGE_EXTERNAL_STORAGE, può accedere a questi file e directory aggiuntivi utilizzando l'API MediaStore o i percorsi diretti dei file. Tuttavia, quando utilizzi Storage Access Framework, puoi accedere a un file o a una directory solo se puoi farlo senza disporre dell'autorizzazione MANAGE_EXTERNAL_STORAGE.

Richiamare l'attività di gestione dello spazio di archiviazione di un'altra app

Su Android 12 (livello API 31) e versioni successive, le app che dispongono sia dell'autorizzazione MANAGE_EXTERNAL_STORAGE sia dell'autorizzazione QUERY_ALL_PACKAGES, ad esempio le app di gestione dei file, possono utilizzare getManageSpaceActivityIntent() per indirizzare gli utenti all'attività di gestione dello spazio personalizzata di un'altra app.

Il metodo getManageSpaceActivityIntent() accetta un nome di pacchetto e un codice di richiesta e restituisce uno dei seguenti valori:

  • Una PendingIntent, se l'app con il nome del pacchetto specificato ha definito un'attività di "gestione dello spazio" personalizzata. L'app di gestione dei file che ha chiamato il metodo getManageSpaceActivityIntent() può quindi richiamare l'intent restituito per indirizzare gli utenti all'attività personalizzata.
  • null, se l'app con il nome del pacchetto specificato non definisce un'attività di "gestione dello spazio".

Attiva MANAGE_EXTERNAL_STORAGE per i test

Per esplorare in che modo l'autorizzazione MANAGE_EXTERNAL_STORAGE influisce sulla tua app, puoi abilitare l'autorizzazione per i test. Per farlo, esegui questo comando sulla macchina collegata al dispositivo di test:

adb shell appops set --uid PACKAGE_NAME MANAGE_EXTERNAL_STORAGE allow

Notifica di Google Play

Questa sezione fornisce una notifica agli sviluppatori che pubblicano app su Google Play.

Per limitare l'accesso ampio allo spazio di archiviazione condiviso, il Google Play Store ha aggiornato le norme per valutare le app destinate ad Android 11 (livello API 30) o versioni successive e richiedere l'accesso a tutti i file tramite l'autorizzazione MANAGE_EXTERNAL_STORAGE. Queste norme sono in vigore a partire da maggio 2021.

Quando la tua app ha come target Android 11 o versioni successive e dichiara l'autorizzazione MANAGE_EXTERNAL_STORAGE, Android Studio mostra l'avviso lint mostrato nella Figura 1. Questo avviso ti ricorda che il Google Play Store prevede norme che limitano l'utilizzo dell'autorizzazione.

Figura 1. Avviso di lint in Android Studio che ricorda agli sviluppatori le norme di Google Play relative all'autorizzazione MANAGE_EXTERNAL_STORAGE.

Richiedi l'autorizzazione MANAGE_EXTERNAL_STORAGE solo quando la tua app non può usare in modo efficace API rispettose della privacy, come Storage Access Framework o l'API Media Store. L'utilizzo dell'autorizzazione da parte dell'app deve rientrare negli utilizzi consentiti e deve essere direttamente collegato alla funzionalità di base dell'app. Se la tua app include un caso d'uso simile a uno dei seguenti, è probabile che possa richiedere l'autorizzazione MANAGE_EXTERNAL_STORAGE: