Differenza tra getExternalFilesDir e getExternalStorageDirectory ()


90

Capisco che ExternalFiles deve essere utilizzato su API 8 e versioni successive e getExternalStorageDirectory per 7 e versioni precedenti. Tuttavia sono un po 'confuso tra l'uso. Ad esempio volevo controllare che una cartella esista e in precedenza avresti usato qualcosa del tipo:

File ChildFolder = new File(Environment.getExternalStorageDirectory() + "/ParentFolder/Child");

Tuttavia ogni esempio che vedo dice di usare getExternalFilesDir (null), File.ext. Dato che sono al di sopra dell'API 8, voglio utilizzare questo metodo, ma come faccio a controllare semplicemente la presenza di una cartella? Controllerò l'esistenza di file in un altro punto ma per ora voglio solo vedere se le cartelle esistono ??

Risposte:


133
getExternalFilesDir()

Restituisce il percorso alla cartella dei file all'interno di Android / data / data / your_package / sulla scheda SD. Viene utilizzato per memorizzare tutti i file richiesti per la tua app (ad esempio immagini scaricate dal web o file di cache). Una volta disinstallata l'app, anche tutti i dati memorizzati in questa cartella saranno spariti.

getExternalStorageDirectory()

Restituisce il percorso di root alla scheda SD (ad esempio mnt / sdcard / ). Se salvi i dati su questo percorso e disinstalli l'app, quei dati non andranno persi.


4
Google Android vuole che tu utilizzi tutto ciò che forniscono all'interno del framework. Quindi dipende dalla tua scelta e dai requisiti di progettazione. Se non desideri che i file rimangano a sinistra quando l'app viene disinstallata, ti invitiamo a utilizzare getExternalFilesDir () o getExternalCacheDir ()
waqaslam

5
È perché nell'API 8, hanno introdotto funzionalità avanzate di scanner multimediale che consentono di scansionare i dati da cartelle come musica, immagini, suonerie, ecc. Queste directory vengono create automaticamente solo se si utilizza getExternalFilesDir () . Poiché questa funzione non era disponibile nell'API 7, è per questo che hanno consigliato di utilizzare getExternalStorageDirectory () . Semplice ...
waqaslam

2
va bene, dagli un po 'di tempo, presto ci sarà un momento eureka :)
waqaslam

3
E 'importante sapere che getExternalStorageDirectory()non non necessariamente - forse anche di solito non - "percorso nella scheda SD" restituire il Restituisce invece la "directory di archiviazione esterna primaria". I documenti ( developer.android.com/reference/android/os/… ) dicono:
LarsH

2
Nota: non lasciarti confondere dalla parola "esterno" qui. Questa directory può essere meglio pensata come supporto / archiviazione condivisa. È un filesystem che può contenere una quantità relativamente grande di dati e che è condiviso tra tutte le applicazioni (non applica le autorizzazioni). Tradizionalmente questa è una scheda SD , ma può anche essere implementata come memoria incorporata in un dispositivo diverso dalla memoria interna protetta e può essere montata come file system su un computer. "
LarsH

70

Prima di tutto, dobbiamo capire qual è la differenza tra archiviazione interna, archiviazione esterna (nota anche come archiviazione esterna primaria) e archiviazione esterna secondaria?

Memoria interna: è una memoria non accessibile dall'utente, se non tramite app installate (o effettuando il rooting del proprio dispositivo). Esempio: data / data / app_packageName

Memoria esterna primaria: nella memoria condivisa incorporata che è "accessibile dall'utente collegando un cavo USB e montandola come unità su un computer host". Esempio: quando diciamo Nexus 5 32 GB.

Memoria esterna secondaria: memoria rimovibile. Esempio: scheda SD.

getExternalFilesDir (String type)

Restituisce il percorso alla cartella dei file all'interno di Android / data / data / your_package / sulla memoria esterna primaria. Che è l'archiviazione integrata.

Environment.getExternalStorageDirectory(type)

Restituirà il percorso della directory di archiviazione esterna secondaria


Grazie per aver spiegato i diversi tipi di archiviazione. Tuttavia, è possibile modificare l' elemento della memoria interna per menzionare che la chiamata al metodo per ottenere quel valore è getFilesDir (). Bene, immagino che il metodo restituisca effettivamente data / data / app_packageName / files ma è ancora memoria interna.
raddevus

3
@VicJordan si prega di scrivere circa File getExternalStoragePublicDirectory (String type)e File getFilesDir ()oltre
AnV

2
Grazie Vic. Environment.getExternalStorageDirectory () output / storage /
emulated

Hai documentazione per l'affermazione che l'archiviazione esterna primaria è sempre integrata, mentre quella secondaria è sempre rimovibile? Pensavo fossero problemi indipendenti ... alcuni telefoni non hanno una memoria "esterna" incorporata, nel qual caso la memoria esterna principale potrebbe essere la scheda SD rimovibile.
LarsH

@LarsH, per quanto ne so attualmente non ci sono telefoni sul mercato o in arrivo in un prossimo futuro che non dispongano di una memoria esterna primaria incorporata. C'erano telefoni all'epoca del pan di zenzero quando esistevano telefoni simili, ma non ora. Potresti nominare "alcuni" telefoni che non hanno "memoria esterna primaria" incorporata?
Vikasdeep Singh

18

! IMPORTANTE AGGIORNAMENTO! per chi incontra questa domanda.

Poiché questa è una domanda un po 'vecchia, volevo solo fornire alcune informazioni aggiuntive. Dal momento che KitKat, anche le app che hanno l' autorizzazione WRITE_EXTERNAL_STORAGE possono solo scrivere su Android / data / data / your_package / su una memoria esterna, aka getExternalFilesDir()

Se proverai a scriverci getExternalStorageDirectory() + "/somefolder/anotherfolder/", otterrai una SecurityException sulla maggior parte dei dispositivi


9
Secondo i documenti, le app che hanno l'autorizzazione WRITE_EXTERNAL_STORAGE POSSONO scrivere nella memoria esterna di altri pacchetti, non solo nella propria. Sono app che NON hanno l'autorizzazione che può scrivere solo nella propria directory: developer.android.com/reference/android/content/… "A partire da KITKAT, non sono richieste autorizzazioni per leggere o scrivere nel percorso restituito; è sempre accessibile all'app chiamante ... Per accedere a percorsi appartenenti ad altri pacchetti, sono necessari WRITE_EXTERNAL_STORAGE e / o READ_EXTERNAL_STORAGE. "
Oded

È qui che "sulla maggior parte dei dispositivi" inizia ad avere importanza poiché i documenti Android generalizzano l'idea, ma i produttori a volte hanno cose come InternalStorage (archiviazione integrata per i dati delle app), ExternalStorage-Primary ( anche archiviazione incorporata con un ambito di accesso più ampio) e ExternalStorage-Secondary (questo sarebbe roba montata come le schede SD). Ora puoi indovinare quale percorso restituisce External StorageDirectory
SGal

7
Questo non affronta le informazioni errate nella tua risposta. "Dal momento che KitKat, anche le app che hanno l'autorizzazione WRITE_EXTERNAL_STORAGE possono solo scrivere su Android / data / data / your_package / su un dispositivo di archiviazione esterno, noto anche come getExternalFilesDir ()". Secondo i documenti, questo è sbagliato. Con WRITE_EXTERNAL_STORAGE, le app possono scrivere su tutta la memoria esterna.
Oded

1
@Oded, l'hai provato? La mia comprensione dei documenti e la mia esperienza con KitKat e dispositivi successivi è diversa dalla tua. (Vorrei avere tempo per eliminare tutti i dettagli ora. Forse più tardi.) La mia esperienza è che SGal ha ragione. Poi c'è anche Lollipop che è un po 'diverso.
LarsH

2
Questa risposta è palesemente falsa, secondo la documentazione di Android. Vedere developer.android.com/reference/android/… "A partire dal livello API 19, questa autorizzazione non è richiesta per leggere / scrivere file nelle directory specifiche dell'applicazione restituite da getExternalFilesDir (String) e getExternalCacheDir ()." (Nota che il livello API 19 = KitKat.) Non ho idea di come abbia ottenuto così tanti voti positivi.
Ajedi32

7

!! IMPORTANTE !!

Environment.getExternalStorageDirectory()è deprecato e al suo posto è necessario utilizzare Context # getExternalFilesDir (String), MediaStore o Intent # ACTION_OPEN_DOCUMENT.

Questo metodo è stato deprecato nel livello API 29. Per migliorare la privacy degli utenti, l'accesso diretto ai dispositivi di archiviazione condivisi / esterni è deprecato. Quando un'app è destinata a Build.VERSION_CODES.Q, il percorso restituito da questo metodo non è più accessibile direttamente alle app. Le app possono continuare ad accedere ai contenuti archiviati nella memoria condivisa / esterna migrando ad alternative come Context # getExternalFilesDir (String), MediaStore o Intent # ACTION_OPEN_DOCUMENT.

https://developer.android.com/reference/android/os/Environment.html#getExternalStorageDirectory ()

Anche a partire da Android.M gli sviluppatori devono chiedere le autorizzazioni in fase di esecuzione.

Vedi maggiori dettagli nella documentazione qui e questa domanda

Environment.getExternalStorageDirectory () obsoleto in Java di livello API 29


se qualcuno sta cercando un link di overflow dello stack e non qualcosa di copiare incollato da Google Docs, guarda qui stackoverflow.com/questions/57116335/…
Rowan Berry

1
A partire da Android 11, le app non possono creare la propria directory specifica per l'app sulla memoria esterna.
Darksymphony
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.