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 archiviazione interno o in directory dedicate diverse all'interno dello spazio di archiviazione esterno. Utilizza le directory all'interno dello spazio di archiviazione interno 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 dati primitivi privati in coppie chiave-valore.
- Database: archivia 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 | Dallo spazio di archiviazione interno, getFilesDir() o
getCacheDir()Dallo spazio di archiviazione esterno, getExternalFilesDir() o
getExternalCacheDir() |
Non è mai necessario per lo spazio di archiviazione interno Non è necessario per lo spazio di archiviazione esterno quando l'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 | Storage Access Framework | Nessuna | Sì, tramite il selettore di file di sistema | No |
| Preferenze dell'app | Coppie chiave-valore | Libreria Jetpack Preferences | Nessuna | No | Sì |
| Database | Dati strutturati | Libreria di persistenza Room | Nessuna | No | Sì |
La soluzione che scegli dipende dalle tue esigenze specifiche:
- Di quanto spazio hanno bisogno i tuoi dati?
- Lo spazio di archiviazione interno 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 quando l'app è in fase di avvio, inserisci i dati nella directory dello spazio di archiviazione interno o in un database. I file specifici dell'app archiviati nello spazio di archiviazione esterno non sono sempre accessibili perché alcuni dispositivi consentono agli utenti di rimuovere un dispositivo fisico corrispondente allo spazio di archiviazione esterno.
- 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 chiave-valore dati) 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 lo spazio di archiviazione interno, le preferenze o un database. Lo spazio di archiviazione interno ha il vantaggio aggiuntivo che i dati sono nascosti agli utenti.
Categorie di posizioni di archiviazione
Android fornisce due tipi di posizioni di archiviazione fisica: spazio di archiviazione interno e spazio di archiviazione esterno. Nella maggior parte dei dispositivi, lo spazio di archiviazione interno è più piccolo dello spazio di archiviazione esterno. Tuttavia, lo spazio di archiviazione interno è sempre disponibile su tutti i dispositivi, il che lo 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 dello spazio di archiviazione
esterno. Android rappresenta questi dispositivi utilizzando un percorso, ad esempio
/sdcard.
Per impostazione predefinita, le app vengono archiviate nello spazio di archiviazione interno. Se le dimensioni dell'APK sono molto grandi, puoi indicare una preferenza nel file manifest dell'app per installare l'app nello spazio di archiviazione esterno:
<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
nello spazio di archiviazione esterno.
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 scriverlo. In
particolare, se la tua app ha come target Android 11 (livello API 30) o versioni successive, l'
WRITE_EXTERNAL_STORAGE autorizzazione non ha alcun effetto sull'accesso dell'app
allo spazio di archiviazione. Questo modello di spazio 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
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.
Spazio di archiviazione mirato
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 allo spazio di archiviazione esterno, o spazio di archiviazione mirato, per impostazione predefinita. Queste app hanno accesso solo alla directory specifica dell'app nello spazio di archiviazione esterno, nonché a tipi specifici di contenuti multimediali creati dall'app.
Utilizza lo spazio di archiviazione mirato 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 nello spazio di archiviazione esterno, puoi
semplificare l'adozione dello spazio di archiviazione mirato inserendo questi file in una
directory specifica dell'app nello spazio di archiviazione
esterno. In questo modo, l'app
mantiene l'accesso a questi file quando lo spazio di archiviazione mirato è attivato.
Per preparare l'app allo spazio di archiviazione mirato, consulta la guida ai casi d'uso e alle best practice per lo spazio di archiviazione. Se la tua app ha un altro caso d'uso non coperto dallo spazio di archiviazione mirato, invia una richiesta di funzionalità. Puoi disattivare temporaneamente l'utilizzo dello spazio di archiviazione mirato.
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.