Android utilizza un file system simile a quello basato 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'uso della tua app in directory dedicate all'interno di un volume di archiviazione interno o in directory dedicate diverse all'interno di uno 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:memorizza dati privati e primitivi 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() |
Non è mai necessaria per lo spazio di archiviazione interno Non è necessaria per lo spazio di archiviazione esterno 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 necessarie 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 | Nessuno | Sì, tramite il selettore di file di sistema | No |
Preferenze delle app | Coppie chiave-valore | Libreria Preferenze di Jetpack | 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 uno spazio limitato per i dati specifici dell'app. Utilizza altri tipi 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 durante l'avvio, inseriscili nella directory della memoria interna 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.
- Di che tipo di dati hai bisogno di 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 accedere ai contenuti. Per i dati strutturati, utilizza le preferenze (per i dati chiave-valore) o un database (per i dati contenenti più di 2 colonne).
- I dati devono essere privati per la tua app?
- Quando memorizzi dati sensibili, ovvero dati che non devono essere accessibili da nessun'altra app, utilizza lo spazio di archiviazione interno, le preferenze o un database. Lo spazio di archiviazione interno offre il vantaggio aggiuntivo che i dati sono nascosti agli utenti.
Categorie di posizioni di archiviazione
Android offre due tipi di posizioni di archiviazione fisica: spazio di archiviazione interno e spazio di archiviazione esterno. Sulla maggior parte dei dispositivi, lo spazio di archiviazione interno è inferiore a quello 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 su 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
.
Le app stesse vengono memorizzate nella memoria interna per impostazione predefinita. Tuttavia, se le dimensioni dell'APK sono molto grandi, puoi indicare una preferenza all'interno del file manifest dell'app per installarla sullo 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'autorizzazioneREAD_EXTERNAL_STORAGE
per accedere a qualsiasi file esterno alle 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 maggiormente sullo scopo di un file rispetto alla sua posizione per determinare la capacità di un'app di accedere e scrivere in un determinato file. In particolare, se la tua app ha come target Android 11 (livello API 30) o versioni successive, l'autorizzazioneWRITE_EXTERNAL_STORAGE
non ha alcun effetto sull'accesso dell'app allo spazio di archiviazione. 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 effettivamente utilizzano.
Android 11 introduce l'autorizzazione MANAGE_EXTERNAL_STORAGE
, che fornisce accesso in scrittura ai file esterni alla directory specifica dell'app e a MediaStore
. Per approfondire questa autorizzazione e scoprire perché 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 basato sugli ambiti
Per offrire agli utenti un maggiore controllo sui propri file e limitare il disordine, per impostazione predefinita alle app destinate ad Android 10 (livello API 29) e versioni successive viene concesso l'accesso limitato allo spazio di archiviazione esterno, ovvero all'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 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 di una directory a cui possono accedere le API MediaStore
. Se memorizzi file specifici dell'app su uno spazio di archiviazione esterno, puoi semplificare l'adozione dello spazio di archiviazione mirato inserendo questi file in una directory specifica dell'app sullo spazio di archiviazione esterno. In questo modo, la tua app mantiene l'accesso a questi file quando lo spazio di archiviazione limitato è attivo.
Per preparare la tua app allo spazio di archiviazione limitato, 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 limitato, 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 Device File Explorer di Android Studio.
Risorse aggiuntive
Per ulteriori informazioni sull'archiviazione dei dati, consulta le seguenti risorse.