Android utilizza un file system simile a quelli basati su disco su altre piattaforme. Il sistema offre diverse opzioni per salvare i dati delle app:
- Spazio di archiviazione specifico dell'app:archivia i file destinati esclusivamente all'uso della tua app, in directory dedicate all'interno di un volume di archiviazione interno o in diverse directory dedicate all'interno dell'archiviazione esterna. Utilizza le directory all'interno dello spazio di archiviazione interno per salvare informazioni sensibili a cui altre app non devono accedere.
- Archiviazione condivisa:archivia i file che la tua app intende condividere con altre app, inclusi contenuti multimediali, documenti e altri file.
- Preferenze:memorizza 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 | Possono accedere altre app? | File rimossi durante la disinstallazione dell'app? | |
---|---|---|---|---|---|
File specifici per le app | File destinati esclusivamente all'uso della tua app | Dalla memoria interna, getFilesDir() o
getCacheDir() Dalla memoria esterna, getExternalFilesDir() o
getExternalCacheDir() |
Mai necessario per l'archiviazione interna Non necessario per l'archiviazione esterna quando la tua app viene utilizzata su dispositivi con Android 4.4 (livello API 19) o versioni successive |
No | Sì |
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 successiveREAD_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 | Framework di accesso all'archiviazione | Nessuno | Sì, tramite il selettore di file di sistema | No |
Preferenze app | Coppie chiave-valore | Libreria Jetpack Preferences | Nessuno | No | Sì |
Database | Dati strutturati | libreria di persistenza Room | Nessuno | No | Sì |
La soluzione che scegli dipende dalle tue esigenze specifiche:
- Quanto spazio richiedono i tuoi dati?
- La memoria interna ha spazio limitato per i dati specifici delle 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, inseriscili nella directory di archiviazione interna o in un database. I file specifici dell'app archiviati nella memoria esterna non sono sempre accessibili perché alcuni dispositivi consentono agli utenti di rimuovere un dispositivo fisico che corrisponde alla memoria esterna.
- Che tipo di dati devi archiviare?
- Se hai 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 in modo che altre app possano accedervi. Per i dati strutturati, utilizza le preferenze (per i dati chiave-valore) o un database (per i dati che contengono più di due colonne).
- I dati devono essere privati per la tua app?
- Quando memorizzi dati sensibili, ovvero dati a cui non deve essere possibile accedere da altre app, utilizza la memoria interna, le preferenze o un database. Lo spazio di archiviazione interno ha l'ulteriore vantaggio di nascondere i dati agli utenti.
Categorie di località di archiviazione
Android fornisce due tipi di posizioni di archiviazione fisica: archiviazione interna e archiviazione esterna. Nella maggior parte dei dispositivi, la memoria interna è inferiore a quella 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, ad esempio una scheda SD, vengono visualizzati nel file system come parte
della memoria esterna. Android rappresenta questi dispositivi utilizzando un percorso, ad esempio
/sdcard
.
Per impostazione predefinita, le app vengono memorizzate nella memoria interna. Se le dimensioni dell'APK sono molto grandi, puoi indicare una preferenza all'interno del file manifest della tua app per installarla invece su una memoria esterna:
<manifest ... android:installLocation="preferExternal"> ... </manifest>
Autorizzazioni e accesso allo spazio di archiviazione esterno
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 devono 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 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 della tua app
allo spazio 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 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 dare agli utenti un maggiore controllo sui propri file e limitare il disordine dei file, le app destinate ad Android 10 (livello API 29) e versioni successive ricevono per impostazione predefinita l'accesso con ambito all'unità di archiviazione esterna, ovvero l'archiviazione con ambito. Queste app hanno accesso solo alla directory specifica dell'app sullo spazio di archiviazione esterno, nonché a tipi specifici di contenuti multimediali che l'app ha creato.
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 possono accedere le API
MediaStore
. Se memorizzi file specifici dell'app su un archivio esterno, puoi
semplificare l'adozione dell'archiviazione isolata inserendo questi file in una
directory specifica dell'app sull'archivio
esterno. In questo modo, la tua app
mantiene l'accesso a questi file quando è attivato lo spazio di archiviazione isolato.
Per preparare la tua app allo spazio di archiviazione isolato, 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 dallo spazio di archiviazione isolato, invia una richiesta di funzionalità. Puoi disattivare temporaneamente l'utilizzo dello storage isolato.
Visualizzare i file su un dispositivo
Per visualizzare i file memorizzati su un dispositivo, utilizza Device File Explorer di Android Studio.
Risorse aggiuntive
Per saperne di più sull'archiviazione dei dati, consulta le seguenti risorse.