getExternalFilesDir和getExternalStorageDirectory()之间的区别


88

我知道在API 8和更高版本上将使用ExternalFiles,而在7和更低版本上将使用getExternalStorageDirectory。但是我对使用之间有些困惑。例如,我想检查一个文件夹是否存在,以前您将使用类似以下内容的文件夹:

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

但是我看到的每个示例都说使用getExternalFilesDir(空),File.ext。由于我高于API 8,因此我想使用此方法,但是如何只检查文件夹?我将在另一点检查文件是否存在,但现在仅想查看文件夹是否存在??

Answers:


132
getExternalFilesDir()

它会将路径返回到SD卡上Android / data / data / your_package /中的files文件夹。它用于存储您的应用程序所需的任何文件(例如,从Web下载的图像或缓存文件)。卸载应用后,该文件夹中存储的所有数据也将消失。

getExternalStorageDirectory()

它将根路径返回到您的SD卡(例如mnt / sdcard /)。如果您在此路径上保存数据并卸载应用程序,则该数据不会丢失。


4
Google Android希望您使用其在框架内提供的任何内容。因此,这取决于您的选择和设计要求。如果您不希望在卸载应用程序时保留文件,则建议您使用getExternalFilesDir()getExternalCacheDir()
waqaslam 2012年

5
这是因为它们在API 8中引入了高级媒体扫描器功能,该功能允许从音乐,图片,铃声等文件夹中扫描数据。仅当您使用getExternalFilesDir()时,才会自动创建这些目录。现在,由于此功能在API 7中不可用,因此他们建议使用getExternalStorageDirectory()。简单...
waqaslam 2012年

2
好的,给它一些时间,很快就会有尤里卡的时刻:)
waqaslam 2012年

3
重要的是要知道这是非常重要getExternalStorageDirectory()不见得甚至-通常不是- “到SD卡路径”返回 而是返回“主要外部存储目录”。文档(developer.android.com/reference/android/os/…)说:
LarsH

2
'注意:请不要在这里与“外部”一词混淆。最好将此目录视为媒体/共享存储。它是一个文件系统,可以保存相对大量的数据,并且可以在所有应用程序之间共享(不强制执行权限)。传统上,这是SD卡,但它也可以实现为设备中的内置存储,该设备与受保护的内部存储不同,可以作为文件系统安装在计算机上。
LarsH

69

首先,我们需要了解内部存储,外部存储(又称主外部存储)和辅助外部存储之间的区别是什么?

内部存储:是用户无法访问的存储,除非通过已安装的应用程序(或通过植根他们的设备)。示例:data / data / app_packageName

主要外部存储设备:内置的共享存储设备,“用户可以通过插入USB电缆并将其作为驱动器安装在主机上进行访问”。示例:当我们说Nexus 5 32 GB时。

辅助外部存储:可移动存储。示例:SD卡。

getExternalFilesDir (String type)

它将路径返回到主外部存储设备上Android / data / data / your_package /中的files文件夹。这是内置存储。

Environment.getExternalStorageDirectory(type)

它将返回辅助外部存储目录的路径


感谢您解释不同类型的存储。但是,也许编辑内部存储项以提及获取该值的方法调用是getFilesDir()。好吧,我猜该方法实际上返回了data / data / app_packageName / files,但它仍然是内部存储。
raddevus 2015年

3
@VicJordan请有关写入File getExternalStoragePublicDirectory (String type)File getFilesDir ()以及
的AnV

2
谢谢维克。Environment.getExternalStorageDirectory()输出/ storage / emulated / 0
gimmegimme

您是否有任何文档说明主外部存储始终是内置的,而辅助外部存储始终是可移动的?我以为那是独立的问题……有些电话没有内置的“外部”存储,在这种情况下,主要的外部存储可能是可移动SD卡。
LarsH

@LarsH,据我所知,目前市场上或即将推出的手机都没有内置的主要外部存储。姜饼存在时有电话,但现在不存在。您能否命名没有内置“主要外部存储”的“某些”手机?
Vikasdeep Singh

17

!重要更新!对于遇到这个问题的人。

因为这是一个有点老的问题,所以只想提供一些其他信息。由于KitKat甚至具有WRITE_EXTERNAL_STORAGE权限的应用程序也只允许在外部存储设备(也称为Android)上写入Android / data / data / your_package / getExternalFilesDir()

如果您尝试写信,getExternalStorageDirectory() + "/somefolder/anotherfolder/"则在大多数设备上都会收到SecurityException


9
根据文档,具有WRITE_EXTERNAL_STORAGE权限的应用程序可以写入其他程序包的外部存储,而不仅仅是自己的。它是不具有只能写入自己目录的权限的应用程序: developer.android.com/reference/android/content/… “从KITKAT开始,不需要任何权限即可读取或写入返回的路径;它始终是调用应用程序可访问...要访问其他包的路径,需要WRITE_EXTERNAL_STORAGE和/或READ_EXTERNAL_STORAGE。”
Oded

这是“在大多数设备上”开始变得重要的地方,因为android文档将这个想法概括化了,但是制造商有时会拥有诸如InternalStorage(用于应用程序数据的内置存储),ExternalStorage-Primary(具有更大访问范围的内置存储)之类的东西。和ExternalStorage-Secondary(将安装SD卡之类的东西)。现在,您可以猜一猜哪条路径获取外部StorageDirectory回报
SGal

7
那不能解决您答案中的错误信息。“由于KitKat甚至具有WRITE_EXTERNAL_STORAGE权限的应用程序也只允许在外部存储(也称为getExternalFilesDir())上写入Android / data / data / your_package /”。根据文档,这是错误的。使用WRITE_EXTERNAL_STORAGE,应用程序可以写入所有外部存储。
奥德

1
@Oded,您测试过了吗?我对文档的理解以及我对KitKat和更高版本设备的了解与您不同。(希望我现在有时间讨论所有细节。也许以后再说。)我的经验是,SGal是正确的。然后还有棒棒糖,有点不同。
LarsH

2
根据Android的文档,这个答案显然是错误的。请参阅developer.android.com/reference/android/… “从API级别19开始,读/写由getExternalFilesDir(String)和getExternalCacheDir()返回的应用程序特定目录中的文件不需要此权限。” (请注意,API级别19 = KitKat。)不知道它如何获得如此多的支持。
Ajedi32

6

!! 重要!

Environment.getExternalStorageDirectory()弃用,应改用Context#getExternalFilesDir(String),MediaStore或Intent#ACTION_OPEN_DOCUMENT。

在API级别29中不赞成使用此方法。为了提高用户隐私,不建议直接访问共享/外部存储设备。当应用程序定位到Build.VERSION_CODES.Q时,此方法返回的路径不再可供应用程序直接访问。通过迁移到Context#getExternalFilesDir(String),MediaStore或Intent#ACTION_OPEN_DOCUMENT之类的替代方案,应用程序可以继续访问共享/外部存储中存储的内容。

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

同样从Android.M开始,开发人员需要在运行时请求权限。

此处此问题中查看文档中的更多详细信息

API级别29中不推荐使用Environment.getExternalStorageDirectory()


如果有人正在寻找一个堆栈溢出链接,不是从复制粘贴谷歌文档看这里stackoverflow.com/questions/57116335/...
罗文贝瑞

1
从Android 11开始,应用程序无法在外部存储设备上创建自己的特定于应用程序的目录。
Darksymphony
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.