getExternalFilesDir和getExternalStorageDirectory()之间的差异

GPG*_*GVM 76 android

我知道ExternalFiles将用于API 8及更高版本,而getExternalStorageDirectory则用于7及更低版本.不过我使用之间有点困惑.例如,我想检查一个存在的文件夹,之前您将使用以下内容:

File ChildFolder = new File(Environment.getExternalStorageDirectory() + "/ParentFolder/Child");
Run Code Online (Sandbox Code Playgroud)

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

TIA JB

waq*_*lam 111

getExternalFilesDir()
Run Code Online (Sandbox Code Playgroud)

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

getExternalStorageDirectory()
Run Code Online (Sandbox Code Playgroud)

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

  • 因为在API 8中,他们引入了高级媒体扫描程序功能,允许从文件夹中扫描数据,如音乐,图片,铃声等.只有在使用**getExternalFilesDir()**时才会自动创建这些目录.现在因为API 7中没有这个功能,所以他们建议使用**getExternalStorageDirectory()**.简单... (5认同)
  • 谷歌Android希望您使用它们在框架内提供的任何内容.因此,它取决于您的选择和设计要求.如果您不希望在卸载应用程序时保留文件,则鼓励您使用**getExternalFilesDir()**或**getExternalCacheDir()** (4认同)
  • 好的,给它一些时间,很快会有一个*eureka*时刻:) (2认同)
  • 重要的是要知道`getExternalStorageDirectory()`并不一定*(甚至可能*通常*)返回“ SD卡的路径”。而是返回“主要外部存储目录”。docs(https://developer.android.com/reference/android/os/Environment.html#getExternalStorageDirectory())说: (2认同)
  • '注意:不要被这里的“外部”这个词混淆。这个目录最好被认为是媒体/共享存储。它是一个文件系统,可以保存相对大量的数据,并在所有应用程序之间共享(不强制执行权限)。**传统上**这是 **SD​​ 卡**,但它也可以作为设备中的内置存储实现,该设备与受保护的内部存储不同,并且可以作为文件系统安装在计算机上。 (2认同)

Vik*_*ngh 48

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

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

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

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

getExternalFilesDir (String type)
Run Code Online (Sandbox Code Playgroud)

它返回主要外部存储器上Android/data/data/your_package /中的files文件夹的路径.这是内置存储.

getExternalStorageDirectory ()
Run Code Online (Sandbox Code Playgroud)

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

  • @VicJordan请写一下`File getExternalStoragePublicDirectory(String type)`和`file getFilesDir()` (2认同)
  • 谢谢维克。Environment.getExternalStorageDirectory() 输出 /storage/emulated/0 (2认同)

SGa*_*Gal 14

!重要更新!无论谁碰到这个问题.

由于这是一个有点老问题,只是想提供一些额外的信息.由于奇巧甚至有应用WRITE_EXTERNAL_STORAGE同意后只允许的Android /数据/数据/ your_package /外部存储,又名 getExternalFilesDir()

如果您尝试写入,getExternalStorageDirectory() + "/somefolder/anotherfolder/"则会在大多数设备上获得SecurityException

  • 根据文档,具有WRITE_EXTERNAL_STORAGE权限的应用程序可以写入其他软件包的外部存储,而不仅仅是它们自己的存储.这是没有,只能写自己的目录权限的应用程序:https://developer.android.com/reference/android/content/Context.html#getExternalFilesDir(java.lang.String)在奇巧"开始,没有权限才能读取或写入到返回的路径;它总是访问调用应用程序...访问属于其他包,WRITE_EXTERNAL_STORAGE和/或READ_EXTERNAL_STORAGE需要路径". (9认同)
  • 这并不能解决您答案中的错误信息."由于KitKat甚至具有WRITE_EXTERNAL_STORAGE权限的应用程序只允许写入外部存储上的Android/data/data/your_package /,即getExternalFilesDir()".根据文档,这是错误的.使用WRITE_EXTERNAL_STORAGE,应用程序可以写入所有外部存储. (7认同)
  • 根据Android的文档,这个答案显然是错误的。请参阅https://developer.android.com/reference/android/Manifest.permission.html#WRITE_EXTERNAL_STORAGE“从API级别19开始,读/写getExternalFilesDir(String)返回的应用程序特定目录中的文件不需要此权限)和getExternalCacheDir()。” (请注意,API级别19 = KitKat。)不知道它如何获得如此多的支持。 (2认同)

may*_*513 11

!! 重要的 !!

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 开始,开发人员需要在运行时请求权限。

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

Environment.getExternalStorageDirectory() 在 API 级别 29 java 中已弃用

  • 从 Android 11 开始,应用程序无法在外部存储上创建自己的应用程序特定目录。 (4认同)