Panoramica dell'archiviazione di dati e file

Android utilizza un file system simile a quelli basati su disco su altre piattaforme. Il sistema offre diverse opzioni per salvare i dati dell'app:

  • Spazio di archiviazione specifico per l'app: archivia i file destinati esclusivamente all'utilizzo dell'app in directory dedicate all'interno di un volume di archiviazione interno o in directory specifiche diverse all'interno dell'unità di archiviazione esterna. Utilizza le directory all'interno dell'unità di archiviazione interna per salvare le informazioni sensibili a cui non dovrebbero accedere altre app.
  • Spazio di archiviazione condiviso: archivia i file che la tua app intende condividere con altre app, inclusi contenuti multimediali, documenti e altri file.
  • Preferenze: archivia dati privati primitivi in coppie chiave-valore.
  • Database: archivia i dati strutturati in un database privato utilizzando la libreria della persistenza della stanza.

Le caratteristiche di queste opzioni sono riassunte nella seguente tabella:

Tipo di contenuti Metodo di accesso Autorizzazioni richieste Possono accedere altre app? File rimossi durante la disinstallazione dell'app?
File specifici dell'app File destinati esclusivamente alla tua app Dalla memoria interna, getFilesDir() o getCacheDir()

Dalla memoria esterna, getExternalFilesDir() o getExternalCacheDir()
Non è mai necessaria per la memoria interna

Non è necessaria per l'archiviazione esterna quando la tua app viene utilizzata su dispositivi con Android 4.4 (livello API 19) o versioni successive
No
Contenuti multimediali File multimediali condivisibili (immagini, file audio, video) API MediaStore READ_EXTERNAL_STORAGE quando accedi ai file di altre app su Android 11 (livello API 30) o versioni successive

READ_EXTERNAL_STORAGE o WRITE_EXTERNAL_STORAGE quando accedi ai file di altre app su Android 10 (livello API 29)

Le autorizzazioni sono obbligatorie per tutti i file su Android 9 (livello API 28) o versioni precedenti
Sì, anche se l'altra app richiede l'autorizzazione READ_EXTERNAL_STORAGE No
Documenti e altri file Altri tipi di contenuti condivisibili, inclusi i file scaricati Framework di accesso allo spazio di archiviazione Nessun valore Sì, tramite il selettore file di sistema No
Preferenze relative alle app Coppie chiave/valore Libreria Preferenze Jetpack Nessun valore No
Database Dati strutturati Libreria di persistenza della stanza Nessun valore No

La soluzione scelta dipende dalle tue esigenze specifiche:

Quanto spazio richiedono i tuoi dati?
La memoria interna ha spazio limitato per i dati specifici dell'app. Utilizza altri tipi di archiviazione se hai bisogno di risparmiare una quantità considerevole di dati.
Quanto deve essere affidabile l'accesso ai dati?
Se la funzionalità di base dell'app richiede determinati dati, ad esempio all'avvio dell'app, posizionali in una directory di archiviazione interna o in un database. I file specifici delle app archiviati in un'unità di archiviazione esterna non sono sempre accessibili perché alcuni dispositivi consentono agli utenti di rimuovere un dispositivo fisico corrispondente a un'unità di archiviazione esterna.
Che tipo di dati devi archiviare?
Se disponi di dati significativi solo per la tua app, utilizza lo spazio di archiviazione specifico per l'app. Per i contenuti multimediali condivisibili, utilizza lo spazio di archiviazione condiviso per consentire ad altre app di accedere ai contenuti. Per i dati strutturati, utilizza le preferenze (per i dati sulle coppie chiave-valore) o un database (per i dati che contengono più di 2 colonne).
I dati devono essere privati per la tua app?
Quando archivi dati sensibili, ovvero dati che non dovrebbero essere accessibili da altre app, utilizza la memoria interna, le preferenze o un database. La memoria interna offre il vantaggio aggiuntivo di nascondere i dati agli utenti.

Categorie di posizioni di archiviazione

Android fornisce due tipi di posizioni di archiviazione fisica: archiviazione interna e archiviazione esterna. Sulla maggior parte dei dispositivi, le dimensioni della memoria interna sono inferiori a quelle esterne. Tuttavia, la memoria interna è sempre disponibile su tutti i dispositivi, il che la rende un posto più affidabile in cui inserire i dati da cui dipende la tua app.

I volumi rimovibili, ad esempio una scheda SD, vengono visualizzati nel file system come parte di uno spazio di archiviazione esterno. Android rappresenta questi dispositivi utilizzando un percorso, ad esempio /sdcard.

Le app sono archiviate nella memoria interna per impostazione predefinita. Se le dimensioni dell'APK sono molto elevate, tuttavia, puoi indicare una preferenza all'interno del file manifest dell'app per installare l'app su un'unità di archiviazione esterna:

<manifest ...
  android:installLocation="preferExternal">
  ...
</manifest>

Autorizzazioni e accesso all'unità di archiviazione esterna

Android definisce le seguenti autorizzazioni relative allo spazio di archiviazione: READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE e MANAGE_EXTERNAL_STORAGE.

Nelle versioni precedenti di Android, le app dovevano dichiarare l'autorizzazione READ_EXTERNAL_STORAGE per accedere a qualsiasi file al di fuori delle directory specifiche dell'app sullo spazio di archiviazione esterno. Inoltre, le app dovevano dichiarare l'autorizzazione WRITE_EXTERNAL_STORAGE per scrivere su qualsiasi file al di fuori della directory specifica dell'app.

Le versioni più recenti di Android si basano più sullo scopo di un file che sulla sua posizione per determinare la capacità di un'app di accedere e scrivere a un determinato file. In particolare, se la tua app ha come target Android 11 (livello API 30) o versioni successive, l'autorizzazione WRITE_EXTERNAL_STORAGE non influisce sull'accesso dello spazio di archiviazione da parte della tua app. Questo modello di archiviazione basato sullo scopo migliora la privacy dell'utente perché alle app viene concesso l'accesso solo alle aree del file system del dispositivo che utilizzano effettivamente.

Android 11 introduce l'autorizzazione MANAGE_EXTERNAL_STORAGE, che fornisce accesso in scrittura ai file al di fuori della directory specifica dell'app e di MediaStore. Per scoprire di più su questa autorizzazione e sul motivo per cui la maggior parte delle app non deve dichiararla per soddisfare i propri casi d'uso, consulta la guida su come gestire tutti i file su un dispositivo di archiviazione.

Archiviazione mirata

Per offrire agli utenti un maggiore controllo sui loro file e limitare il disordine dei file, per impostazione predefinita alle app destinate ad Android 10 (livello API 29) e versioni successive viene concesso l'accesso limitato all'archiviazione esterna, o archiviazione con ambito. Queste app hanno accesso solo alla directory specifica dell'app sull'unità di archiviazione esterna, nonché ai tipi di contenuti multimediali specifici creati dall'app.

Utilizza l'archiviazione con ambito, a meno che la tua app non abbia bisogno di accedere a un file archiviato all'esterno di una directory specifica dell'app e al di fuori di una directory accessibile dalle API di MediaStore. Se archivi file specifici dell'app su un'unità di archiviazione esterna, puoi semplificare l'adozione dell'archiviazione con ambito inserendo questi file in una directory specifica dell'app sullo spazio di archiviazione esterno. In questo modo, l'app mantiene l'accesso a questi file quando è abilitata l'archiviazione con ambito.

Per preparare l'app per l'archiviazione con ambito, consulta la guida Casi d'uso e best practice per lo spazio di archiviazione. Se la tua app ha un altro caso d'uso non coperto dall'archiviazione con ambito, invia una richiesta di funzionalità. Puoi disattivare temporaneamente l'utilizzo dello spazio di archiviazione con ambito.

Visualizzare i file su un dispositivo

Per visualizzare i file memorizzati su un dispositivo, utilizza Explorer file dispositivo di Android Studio.

Risorse aggiuntive

Per ulteriori informazioni sull'archiviazione dei dati, consulta le risorse seguenti.

Video