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 accesso ampio ai file su un dispositivo, ma non possono accedervi in modo efficiente utilizzando le best practice di archiviazione rispettose della privacy. Per queste situazioni, Android fornisce un accesso speciale per le 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 scansione richiede ripetute interazioni dell'utente per selezionare le directory utilizzando il selettore di file di sistema, offre un'esperienza utente negativa. Altri casi d'uso, come app di gestione file, app di backup e ripristino e app di gestione documenti, richiedono considerazioni simili.
Richiedere l'accesso a tutti i file
Un'app può richiedere all'utente l'accesso a tutti i file nel seguente modo:
- Dichiara l'autorizzazione
MANAGE_EXTERNAL_STORAGE
nel file manifest. - 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.
Accedi ai contenuti della tabella
MediaStore.Files
.Accedere alla directory principale sia dell'unità USB on-the-go (OTG) sia 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 al percorso del file diretto.Le app a cui è stata concessa questa autorizzazione non possono comunque accedere alle directory specifiche per app appartenenti ad altre app, perché queste directory vengono visualizzate come sottodirectory di
Android/data/
su un volume di archiviazione.
Quando un'app dispone dell'autorizzazione MANAGE_EXTERNAL_STORAGE
, può accedere a questi
file e directory aggiuntivi utilizzando l'API
MediaStore
o i percorsi di file diretti. Tuttavia, quando utilizzi il Framework di accesso allo spazio di archiviazione, 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 personalizzato di un'altra app.
Il metodo getManageSpaceActivityIntent()
riceve un nome del pacchetto e un codice di richiesta e restituisce uno dei seguenti valori:
- Un
PendingIntent
, se l'app con il nome del pacchetto specificato ha definito un'attività "Gestisci spazio" personalizzata. L'app di gestione dei file che ha chiamato il metodogetManageSpaceActivityIntent()
può quindi invocare l'intent restituito per indirizzare gli utenti all'attività personalizzata. null
, se l'app con il nome del pacchetto specificato non definisce un'attività "Gestisci spazio".
Attivare MANAGE_EXTERNAL_STORAGE per i test
Per scoprire in che modo l'autorizzazione MANAGE_EXTERNAL_STORAGE
influisce sulla tua app, puoi attivarla per i test. Per farlo, esegui il seguente
comando sulla macchina connessa al dispositivo di test:
adb shell appops set --uid PACKAGE_NAME MANAGE_EXTERNAL_STORAGE allow
Notifica di Google Play
Questa sezione fornisce una notifica per gli sviluppatori che pubblicano app su Google Play.
Per limitare l'accesso ampio allo spazio di archiviazione condiviso, il Google Play Store ha aggiornato le proprie linee guida per valutare le app che hanno come target Android 11 (livello API 30) o versioni successive e richiedono l'accesso a tutti i file tramite l'autorizzazione MANAGE_EXTERNAL_STORAGE
. Queste norme sono in vigore da maggio 2021.
Quando l'app ha come target Android 11 o versioni successive e dichiara l'autorizzazioneMANAGE_EXTERNAL_STORAGE
, Android Studio mostra l'avviso lint riportato nella figura 1. Questo avviso ti ricorda che il Google Play Store ha delle norme che limitano l'utilizzo dell'autorizzazione.
MANAGE_EXTERNAL_STORAGE
.
Richiedi l'autorizzazione MANAGE_EXTERNAL_STORAGE
solo se la tua app non può utilizzare in modo efficace le API più 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
:
- Gestori di file
- App di backup e ripristino
- App antivirus
- App di gestione dei documenti
- Ricerca di file sul dispositivo
- Crittografia di file e dischi
- Migrazione dei dati da un dispositivo all'altro