102

我知道 ExternalFiles 将用于 API 8 及更高版本,而 getExternalStorageDirectory 用于 7 及以下版本。但是我在使用之间有点困惑。例如,我想检查一个文件夹是否存在,以前你会使用类似的东西:

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

但是,我看到的每个示例都说要使用 getExternalFilesDir (null)、File.ext。由于我在 API 8 以上,我想使用这种方法,但我如何检查文件夹?我将在另一点检查文件是否存在,但现在只想查看文件夹是否存在?

4

4 回答 4

149
getExternalFilesDir()

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

getExternalStorageDirectory()

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

于 2012-04-12T12:57:56.963 回答
91

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

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

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

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

getExternalFilesDir (String type)

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

Environment.getExternalStorageDirectory()

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

于 2015-04-02T03:18:50.203 回答
20

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

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

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

于 2015-03-03T10:08:46.643 回答
13

!!重要的 !!

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 java 中不推荐使用 Environment.getExternalStorageDirectory()

于 2020-01-19T17:30:00.480 回答