Panoramica dell'archiviazione di dati e file

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

  • Spazio di archiviazione specifico dell'app: archivia i file destinati esclusivamente all'utilizzo da parte della tua app, in directory dedicate all'interno di un volume di memoria interna o in directory dedicate diverse all'interno dell'unità di archiviazione esterna. Utilizza le directory all'interno della memoria interna per salvare informazioni sensibili a cui altre app non devono accedere.
  • 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 i dati primitivi privati in coppie chiave-valore.
  • Database: archivia i dati strutturati in un database privato utilizzando la libreria di persistenza Room.

Le caratteristiche di queste opzioni sono riassunte nella tabella seguente:

Tipo di contenuti Metodo di accesso Autorizzazioni richieste Altre app possono accedere? I file vengono rimossi alla disinstallazione dell'app?
File specifici dell'app File destinati esclusivamente all'utilizzo da parte della tua app Dalla memoria interna, getFilesDir() o getCacheDir()

Dall'unità di archiviazione esterna, getExternalFilesDir() o getExternalCacheDir()
Non è mai necessario per la memoria interna

Non è necessario per l'unità di archiviazione esterna quando l'app viene utilizzata su dispositivi con Android 4.4 (livello API 19) o versioni successive
No
Media File multimediali condivisibili (immagini, file audio, video) API MediaStore READ_EXTERNAL_STORAGE quando si accede ai file di altre app su Android 11 (livello API 30) o versioni successive

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

Le autorizzazioni sono richieste per tutti i file su Android 9 (livello API 28) o versioni precedenti
Sì, anche se l'altra app ha bisogno dell'autorizzazione READ_EXTERNAL_STORAGE No
Documenti e altri file Altri tipi di contenuti condivisibili, inclusi i file scaricati Storage Access Framework Nessuna Sì, tramite il selettore file di sistema No
Preferenze dell'app Coppie chiave-valore Libreria Jetpack Preferences Nessuna No
Database Dati strutturati Libreria di persistenza Room Nessuna No

La soluzione che scegli dipende dalle tue esigenze specifiche:

Di quanto spazio hanno bisogno i tuoi dati?
La memoria interna ha uno spazio limitato per i dati specifici dell'app. Utilizza altri tipi di spazio di archiviazione se devi salvare una quantità significativa 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, inserisci i dati nella directory di memoria interna o in un database. I file specifici dell'app archiviati nell'unità di archiviazione esterna non sono sempre accessibili perché alcuni dispositivi consentono agli utenti di rimuovere un dispositivo fisico corrispondente all'unità di archiviazione esterna.
Che tipo di dati devi archiviare?
Se hai dati significativi solo per la tua app, utilizza lo spazio di archiviazione specifico dell'app. Per i contenuti multimediali condivisibili, utilizza lo spazio di archiviazione condiviso in modo che altre app possano accedere ai contenuti. Per i dati strutturati, utilizza le preferenze (per i dati coppia 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 a cui non deve essere possibile accedere da altre app, utilizza la memoria interna, le preferenze o un database. La memoria interna ha l'ulteriore vantaggio che i dati sono nascosti agli utenti.

Categorie di posizioni di archiviazione

Android fornisce due tipi di posizioni di archiviazione fisica: memoria interna e unità di archiviazione esterna. Nella maggior parte dei dispositivi, la memoria interna è più piccola dell'unità di archiviazione esterna. Tuttavia, la memoria interna è sempre disponibile su tutti i dispositivi, il che la rende un luogo più affidabile per inserire i dati da cui dipende la tua app.

I volumi rimovibili, come una scheda SD, vengono visualizzati nel file system come parte dell'unità di archiviazione esterna. Android rappresenta questi dispositivi utilizzando un percorso, ad esempio /sdcard.

Per impostazione predefinita, le app vengono archiviate nella memoria interna. Se le dimensioni dell'APK sono molto grandi, puoi indicare una preferenza nel file manifest dell'app per installare l'app nell'unità di archiviazione esterna:

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

Autorizzazioni e accesso all'unità di archiviazione esterna

Android definisce le seguenti autorizzazioni relative all'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 nell'unità di archiviazione esterna. Inoltre, le app dovevano dichiarare l'autorizzazione WRITE_EXTERNAL_STORAGE per scrivere in qualsiasi file al di fuori della directory specifica dell'app.

Le versioni più recenti di Android si basano maggiormente sullo scopo di un file piuttosto che sulla sua posizione per determinare la capacità di un'app di accedere a un determinato file e di scriverci. In particolare, se la tua app ha come target Android 11 (livello API 30) o versioni successive, l'autorizzazione WRITE_EXTERNAL_STORAGE non ha alcun effetto sull'accesso dell'app all'unità di archiviazione. Questo modello di archiviazione basato sullo scopo migliora la privacy degli utenti perché le app hanno accesso solo alle aree del file system del dispositivo che utilizzano effettivamente.

Android 11 introduce l'autorizzazione MANAGE_EXTERNAL_STORAGE, che fornisce l'accesso in scrittura ai file al di fuori della directory specifica dell'app e di MediaStore. Per saperne 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 consentire agli utenti di avere un maggiore controllo sui propri file e per limitare l'ingombro dei file, le app che hanno come target Android 10 (livello API 29) e versioni successive hanno accesso mirato all'unità di archiviazione esterna, o archiviazione mirata, per impostazione predefinita. Queste app hanno accesso solo alla directory specifica dell'app nell'unità di archiviazione esterna, nonché a tipi specifici di contenuti multimediali creati dall'app.

Utilizza l'archiviazione mirata a meno che la tua app non abbia bisogno di accedere a un file archiviato al di fuori di una directory specifica dell'app e al di fuori di una directory a cui le API MediaStore possono accedere. Se archivi file specifici dell'app nell'unità di archiviazione esterna, puoi semplificare l'adozione dell'archiviazione mirata inserendo questi file in una directory specifica dell'app nell'unità di archiviazione esterna. In questo modo, la tua app mantiene l'accesso a questi file quando l'archiviazione mirata è abilitata.

Per preparare la tua app all'archiviazione mirata, consulta la guida ai casi d'uso e alle best practice per l'archiviazione. Se la tua app ha un altro caso d'uso non coperto dall'archiviazione mirata, invia una richiesta di funzionalità. Puoi disattivare temporaneamente l'utilizzo dell'archiviazione mirata.

Visualizzare i file su un dispositivo

Per visualizzare i file archiviati su un dispositivo, utilizza Esplora file del dispositivo di Android Studio.

Risorse aggiuntive

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

Video