listFiles() 在 /storage/emulated 上返回 null,而 /storage/emulated/0 存在

Posted

技术标签:

【中文标题】listFiles() 在 /storage/emulated 上返回 null,而 /storage/emulated/0 存在【英文标题】:listFiles() returns null on /storage/emulated, while /storage/emulated/0 exists 【发布时间】:2020-01-09 21:58:28 【问题描述】:

我正在 android 27 模拟器上测试并尝试遍历一些目录。

当我尝试遍历/storage/emulated 目录时,方法listFiles() 返回null/storage/emulated/0 存在。

这是一个测试代码:

File emuDir = new File("/storage/emulated");
File[] emuDirFiles = emuDir.listFiles(); // returns null.

File exStorageDir = new File("/storage/emulated/0")
exStorageDir.exists(); // returns true

附:我已在清单中添加了适当的存储权限并授予了运行时权限。

【问题讨论】:

【参考方案1】:

简答:Android 不会授予您的应用访问/storage/emulated 的权限。

长答案以及您的解决方案不起作用的原因:

您授予了哪些权限?我认为它们是EXTERNAL_WRITE/EXTERNAL_READ,它们可以让您访问/storage/emulated/0,它与getExternalStorageDirectory() 返回的目录相同。 Android 不授予/storage/emulated 的读/写权限。作为旁注,如果File.canRead() 返回false,则您不能listFiles() 该目录。在您的情况下,即使您添加了权限emuDir.canRead() 也会返回false,因为这些权限授予对/storage/emulated/0 的访问权限而不是/storage/emulated

【讨论】:

我已授予android.permission.WRITE_EXTERNAL_STORAGEandroid.permission.READ_EXTERNAL_STORAGE。还检查了/storage/emulated 上的方法canRead(),它返回false。我想知道为什么会发生这种情况,因为我可以遍历系统目录,例如 /proc 目录和其他目录。 如果它返回false,你什么也做不了。 Android 的 /system 目录是可读的(canRead() 返回 true),这就是您可以列出该目录中的文件的原因。但是/storage/emulated 是不可读的,除非你 root 设备。 不幸的是,无论您添加什么权限,Android 都没有访问该目录的权限类别。 出于好奇,请问您尝试访问该目录的原因。如果这是私人事情,您不必回答))。如果我有什么想法,我可能会建议一个替代方案。 谢谢,我认为这是一个公认的答案。但是,以这种方式无法访问它有点令人困惑。【参考方案2】:

它与Scoped Storage有关。为了解决这个问题,写

 android:requestLegacyExternalStorage="true"

在清单文件的应用程序标签中,如下所示。

欲了解更多信息:https://medium.com/@pednekarshashank33/android-10s-scoped-storage-image-picker-gallery-camera-d3dcca427bbf

【讨论】:

谢谢,这对我有帮助。请注意,虽然此修复程序不适用于 Android 11+。【参考方案3】:

请求权限成功后。添加这一行:

android:requestLegacyExternalStorage="true"

在 AndroidManifest.xml 中限定“应用程序”

【讨论】:

注意事项:medium.com/androiddevelopers/scope-storage-myths-ca6a97d7ff37

以上是关于listFiles() 在 /storage/emulated 上返回 null,而 /storage/emulated/0 存在的主要内容,如果未能解决你的问题,请参考以下文章

listFiles() 在 /storage/emulated 上返回 null,而 /storage/emulated/0 存在

如何在 Java 7 中用 nio 替换 File.listFiles(FileFilter filter)?

ftpClient.listFiles 获取的目录总数不对

FTPClient.listFiles()不能获取文件

将 File.listFiles 与 FileNameExtensionFilter 一起使用

文件存在且是目录,但 listFiles() 返回 null