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_STORAGE
和android.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)?