listFiles() returns 在 /storage/emulated 上为空,而 /storage/emulated/0 存在

listFiles() returns null on /storage/emulated, while /storage/emulated/0 exists

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

当我尝试遍历 /storage/emulated 目录时,listFiles() returns 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

P.S。我已经在清单中添加了适当的存储权限并授予了运行时权限。

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

的权限

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

您授予了哪些权限?我假设它们是 EXTERNAL_WRITE/EXTERNAL_READ,它们会让您访问 /storage/emulated/0,这是由 getExternalStorageDirectory() 编辑的同一目录 return。 Android 未授予 read/write 对 /storage/emulated 的许可。作为旁注,如果 File.canRead() returns false 你不能 listFiles() 该目录。在您的情况下,即使您添加了权限 emuDir.canRead() 也会 return false 因为这些权限授予访问 /storage/emulated/0 而不是 /storage/emulated

它与分区存储有关。要解决这个问题,写

 android:requestLegacyExternalStorage="true"

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

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

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

android:requestLegacyExternalStorage="true"

在 AndroidManifest.xml

中确定“应用程序”的范围