2012-04-12 5 views
49

Je comprends que ExternalFiles doit être utilisé sur API 8 et plus et getExternalStorageDirectory est pour 7 et moins. Cependant je suis un peu confus entre l'utilisation. Par exemple, je voulais vérifier qu'un dossier existe et déjà vous pouvez utiliser quelque chose comme:Diff entre getExternalFilesDir et getExternalStorageDirectory()

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

Cependant, chaque exemple, je vois dit d'utiliser getExternalFilesDir (null), fichier.ext. Puisque je suis au-dessus de l'API 8, je veux utiliser cette méthode mais comment vérifier 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?

TIA JB

Répondre

86
getExternalFilesDir() 

Il retourne le chemin d'accès fichiers de dossiers 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 de fichiers Web ou de cache). Une fois l'application désinstallée, toutes les données stockées dans ce dossier ont également disparu.

getExternalStorageDirectory() 

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

+1

Donc, vous dites que Google Android gars veulent que vous utilisez uniquement API getExternalFilesDir() 8 ans et plus donc si vous êtes conforme à vos fichiers seront supprimés à désinstaller? Ne vous méprenez pas, je veux ce comportement car je ne veux pas laisser les fichiers laissés en place si quelqu'un désinstalle. L'autre élément dont je ne suis pas sûr, mais qui expérimente maintenant, est exactement comment ça se passe si un dossier est là. Par exemple va-t-il retourner quelque chose pour cette ligne: File (getExternalFilesDir (null), "/ ParentFldr/ChildFldr"); – GPGVM

+3

Google Android veut que vous utilisiez tout ce qu'ils fournissent dans le cadre. Donc, c'est à votre choix et les 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

+0

Bien sûr, je peux voir exactement ce que vous dites .. .Je suis juste confus par cette ligne de Dev Docs. "Si vous utilisez l'API Niveau 7 ou inférieur, utilisez getExternalStorageDirectory(), pour ..." et "Si vous utilisez API niveau 8 ou supérieur, utilisez getExternalFilesDir() pour ouvrir un fichier qui ..." ces deux les lignes viennent d'ici: http://developer.android.com/guide/topics/data/data-storage.html#filesExternal. Je crois que vous avez utilisé les deux avec succès, je ne voulais pas utiliser quelque chose qui pourrait disparaître des futures versions de l'API. – GPGVM

11

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

Comme il s'agit d'une question un peu ancienne, je voulais juste fournir des informations supplémentaires. Depuis KitKat même des applications qui ont WRITE_EXTERNAL_STORAGE autorisation sont seulement permis d'écrire à Android/data/data/your_package/ sur le stockage externe, akagetExternalFilesDir()

Si vous essayez d'écrire getExternalStorageDirectory() + "/somefolder/anotherfolder/" vous voulez obtenir une SecurityException sur la plupart des périphériques

+7

Selon les docs, les applications qui ont l'autorisation WRITE_EXTERNAL_STORAGE PEUVENT écrire dans le stockage externe d'autres packages, et pas seulement dans le leur. Ce sont des applications qui n'ont pas l'autorisation qui ne peut écrire dans leur propre répertoire: https://developer.android.com/reference/android/content/Context.html#getExternalFilesDir(java.lang.String) " A partir de KITKAT, aucune autorisation n'est requise pour lire ou écrire sur le chemin retourné, il est toujours accessible à l'application appelante ... Pour accéder aux chemins appartenant à d'autres paquets, WRITE_EXTERNAL_STORAGE et/ou READ_EXTERNAL_STORAGE sont obligatoires. " – Oded

+0

C'est là que "sur la plupart des appareils" commence à importer car les docs android généralisent l'idée, mais les fabricants ont parfois des choses comme InternalStorage (stockage intégré pour les données d'application), ExternalStorage-Primary (* également intégré dans le stockage * access scope) et ExternalStorage-Secondary (ceci serait monté comme des cartes SD). Vous pouvez maintenant deviner le chemin d'accès. * External * StorageDirectory renvoie – SGal

+5

Cela ne répond pas aux informations incorrectes dans votre réponse. "Puisque même les applications KitKat qui ont l'autorisation WRITE_EXTERNAL_STORAGE sont autorisées à écrire sur Android/data/data/your_package/sur un stockage externe, a.k.a getExternalFilesDir()". Par les docs, c'est faux.Avec WRITE_EXTERNAL_STORAGE, les applications peuvent écrire sur tous les supports de stockage externes. – Oded

25

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

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

Stockage externe principal: Dans un stockage partagé intégré "accessible par l'utilisateur en branchant un câble USB et en le montant en tant que lecteur sur un ordinateur hôte". Exemple: Lorsque nous disons Nexus 5 32 GB.

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

getExternalFilesDir (String type) 

Il renvoie le chemin d'accès au dossier de fichiers dans Android/data/data/your_package/sur le stockage externe principal. Quel est le stockage intégré.

getExternalStorageDirectory() 

Il retournera chemin du répertoire de stockage externe primaire

+0

Merci d'expliquer les différents types de stockage. Cependant, modifiez peut-être l'élément _internal storage_ pour indiquer que l'appel de méthode pour obtenir cette valeur est getFilesDir(). Eh bien, je suppose que cette méthode retourne en réalité data/data/app_packageName/files mais c'est toujours un stockage interne. – raddevus

+2

@VicJordan S'il vous plaît écrire sur 'File getExternalStoragePublicDirectory (String type)' et 'Fichier getFilesDir()' ainsi – AnV

+0

Merci Vic. Environment.getExternalStorageDirectory() outputs/storage/emulated/0 – gimmegimme

Questions connexes