Différence entre getExternalFilesDir et getExternalStorageDirectory ()

89

Je comprends que ExternalFiles doit être utilisé sur l'API 8 et plus et getExternalStorageDirectory est pour 7 et plus. Cependant je suis un peu confus entre l'utilisation. Par exemple, je voulais vérifier qu'un dossier existe et que vous utiliseriez auparavant quelque chose comme:

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

Cependant, chaque exemple que je vois indique d'utiliser getExternalFilesDir (null), File.ext. Comme je suis au-dessus de l'API 8, je souhaite utiliser cette méthode, mais comment puis-je simplement rechercher un dossier? Je vais vérifier l'existence d'un fichier à un autre moment, mais pour l'instant je veux juste voir si les dossiers existent ??

GPGVM
la source

Réponses:

132
getExternalFilesDir()

Il renvoie le chemin d'accès au dossier de fichiers dans Android / data / data / your_package / sur votre carte SD. Il est utilisé pour stocker tous les fichiers requis pour votre application (par exemple, des images téléchargées à partir du Web ou des fichiers cache). Une fois l'application désinstallée, toutes les données stockées dans ce dossier disparaissent également.

getExternalStorageDirectory()

Il renvoie le chemin racine de votre carte SD (par exemple mnt / sdcard / ). Si vous enregistrez des données sur ce chemin et désinstallez l'application, ces données ne seront pas perdues.

waqaslam
la source
4
Google Android veut que vous utilisiez tout ce qu'ils fournissent dans le cadre. C'est donc à votre choix et à vos exigences de conception. Si vous ne voulez pas que les fichiers restent à gauche lorsque l'application est désinstallée, vous êtes encouragés à utiliser getExternalFilesDir () ou getExternalCacheDir ()
waqaslam
5
C'est parce que dans l'API 8, ils ont introduit des fonctionnalités avancées de scanner multimédia qui permettent de numériser des données à partir de dossiers comme la musique, les images, les sonneries, etc. Ces répertoires sont créés automatiquement uniquement si vous utilisez getExternalFilesDir () . Maintenant que cette fonctionnalité n'était pas disponible dans l'API 7, c'est pourquoi ils ont recommandé d'utiliser getExternalStorageDirectory () . Simple ...
waqaslam
2
c'est ok, donnez-lui un peu de temps, bientôt il y aura un moment eureka :)
waqaslam
3
Il est important de savoir que getExternalStorageDirectory()cela ne renvoie pas nécessairement - peut-être même pas habituellement - le «chemin vers votre carte SD». Au lieu de cela, il renvoie le "répertoire de stockage externe principal". Les documents ( developer.android.com/reference/android/os/… ) disent:
LarsH
2
'Remarque: ne vous laissez pas confondre par le mot "externe" ici. Ce répertoire peut mieux être considéré comme un stockage multimédia / partagé. Il s'agit d'un système de fichiers qui peut contenir une quantité relativement importante de données et qui est partagé entre toutes les applications (n'applique pas les autorisations). Il s'agit traditionnellement d' une carte SD , mais elle peut également être implémentée en tant que stockage intégré dans un périphérique distinct du stockage interne protégé et peut être montée en tant que système de fichiers sur un ordinateur.
LarsH
69

Tout d'abord, nous devons comprendre quelle est la différence entre le stockage interne, le stockage externe (alias stockage externe principal) et le stockage externe secondaire?

Stockage interne: c'est le stockage qui n'est pas accessible par l'utilisateur, sauf via les applications installées (ou en rootant son appareil). Exemple: data / data / app_packageName

Stockage externe principal: dans le stockage partagé intégré qui est "accessible par l'utilisateur en branchant un câble USB et en le montant comme lecteur sur un ordinateur hôte". Exemple: quand on dit Nexus 5 32 Go.

Stockage externe secondaire: stockage amovible. Exemple: carte SD.

getExternalFilesDir (String type)

Il renvoie le chemin du dossier de fichiers dans Android / data / data / your_package / sur le stockage externe principal. Qui est le stockage intégré.

Environment.getExternalStorageDirectory(type)

Il renverra le chemin du répertoire de stockage externe secondaire

Vikasdeep Singh
la source
Merci d'avoir expliqué les différents types de stockage. Cependant, modifiez peut-être l' élément de stockage interne pour mentionner que l'appel de méthode pour obtenir cette valeur est getFilesDir (). Eh bien, je suppose que cette méthode renvoie en fait des données / données / app_packageName / files, mais il s'agit toujours d'un stockage interne.
raddevus
3
@VicJordan S'il vous plaît écrivez sur File getExternalStoragePublicDirectory (String type)et File getFilesDir ()aussi
AnV
2
Merci Vic. Environment.getExternalStorageDirectory () sorties / stockage / émulé / 0
gimmegimme
Avez-vous une documentation indiquant que le stockage externe principal est toujours intégré, tandis que le secondaire est toujours amovible? Je pensais que c'étaient des problèmes indépendants ... certains téléphones n'ont pas de stockage "externe" intégré, auquel cas le stockage externe principal pourrait être la carte SD amovible.
LarsH
@LarsH, à ma connaissance, il n'y a actuellement aucun téléphone sur le marché ou dans un avenir proche qui n'aura pas de stockage externe principal intégré. Il y avait des téléphones à l'époque du pain d'épice quand de tels téléphones existaient mais pas maintenant. Pourriez-vous s'il vous plaît nommer «certains» téléphones qui n'ont pas de «stockage externe principal» intégré?
Vikasdeep Singh
17

! MISE À JOUR IMPORTANTE! pour quiconque rencontre cette question.

Comme il s'agit d'une question quelque peu ancienne, je voulais simplement fournir des informations supplémentaires. Étant donné que KitKat, même les applications disposant de l' autorisation WRITE_EXTERNAL_STORAGE ne sont autorisées à écrire que sur Android / data / data / your_package / sur un stockage externe, aka getExternalFilesDir()

Si vous essayez d'écrire, getExternalStorageDirectory() + "/somefolder/anotherfolder/"vous obtiendrez une exception SecurityException sur la plupart des appareils

SGal
la source
9
Selon la documentation, les applications disposant de l'autorisation WRITE_EXTERNAL_STORAGE PEUVENT écrire sur le stockage externe d'autres packages, pas seulement sur le leur. Ce sont les applications qui n'ont PAS l'autorisation d'écrire uniquement dans leur propre répertoire: developer.android.com/reference/android/content/… "À partir de KITKAT, aucune autorisation n'est requise pour lire ou écrire dans le chemin renvoyé; c'est toujours accessible à l'application appelante ... Pour accéder aux chemins appartenant à d'autres packages, WRITE_EXTERNAL_STORAGE et / ou READ_EXTERNAL_STORAGE sont nécessaires. "
Oded le
C'est là que «sur la plupart des appareils» commence à avoir de l'importance alors que la documentation Android généralise l'idée, mais les fabricants ont parfois des choses comme InternalStorage (stockage intégré pour les données d'application), ExternalStorage-Primary ( également un stockage intégré avec une plus grande portée d'accès) et ExternalStorage-Secondary (ce serait des éléments montés comme des cartes SD). Vous pouvez maintenant deviner quel chemin pour obtenir les retours de External StorageDirectory
SGal
7
Cela ne répond pas aux informations incorrectes dans votre réponse. "Depuis KitKat, même les applications qui ont l'autorisation WRITE_EXTERNAL_STORAGE ne sont autorisées à écrire que sur Android / data / data / your_package / sur un stockage externe, alias getExternalFilesDir ()". Selon la documentation, c'est faux. Avec WRITE_EXTERNAL_STORAGE, les applications peuvent écrire sur tout le stockage externe.
Oded le
1
@Oded, avez-vous testé ça? Ma compréhension de la documentation et mon expérience avec KitKat et les appareils ultérieurs sont différentes de la vôtre. (J'aurais aimé avoir le temps de hacher tous les détails maintenant. Peut-être plus tard.) Mon expérience est que SGal a raison. Ensuite, il y a aussi Lollipop qui est un peu différent.
LarsH
2
Cette réponse est manifestement fausse, selon la documentation d'Android. Voir developer.android.com/reference/android/… "À partir du niveau d'API 19, cette autorisation n'est pas requise pour lire / écrire des fichiers dans les répertoires spécifiques à votre application renvoyés par getExternalFilesDir (String) et getExternalCacheDir ()." (Notez que le niveau d'API 19 = KitKat.) Je ne sais pas comment il a obtenu autant de votes positifs.
Ajedi32
6

!! IMPORTANT !!

Environment.getExternalStorageDirectory()est obsolète et Context # getExternalFilesDir (String), MediaStore ou Intent # ACTION_OPEN_DOCUMENT, doit être utilisé à la place.

Cette méthode est obsolète au niveau de l'API 29. Pour améliorer la confidentialité des utilisateurs, l'accès direct aux périphériques de stockage partagés / externes est obsolète. Lorsqu'une application cible Build.VERSION_CODES.Q, le chemin renvoyé par cette méthode n'est plus directement accessible aux applications. Les applications peuvent continuer à accéder au contenu stocké sur un stockage partagé / externe en migrant vers des alternatives telles que Context # getExternalFilesDir (String), MediaStore ou Intent # ACTION_OPEN_DOCUMENT.

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

À partir d'Android.M, les développeurs doivent également demander des autorisations au moment de l'exécution.

Voir plus de détails dans la documentation ici et cette question

Environment.getExternalStorageDirectory () obsolète dans l'API niveau 29 Java

mayank1513
la source
si quelqu'un cherche un lien de débordement de pile et non quelque chose de copié à partir de Google Docs, regardez ici stackoverflow.com/questions/57116335/…
Rowan Berry