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

3

我正在使用安卓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

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

3个回答

5

简短回答: 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目录和其他目录。 - undefined
很遗憾,无论您添加了什么权限,Android都没有访问该目录的权限类别。 - undefined
我能问一下你为什么想要访问那个目录吗,只是出于好奇。如果这是私人的事情,你不必回答)。如果我有任何想法,我可以提供一个替代方案。 - undefined
我正在遍历从根目录开始的所有目录,但在这个过程中,它无法遍历/storage/emulated目录!你有什么建议吗? - undefined
1
谢谢,我认为这是一个被接受的答案。然而,有点令人困惑的是它不能以这种方式访问。 - undefined
显示剩余2条评论

1

谢谢,这对我很有帮助。不过请注意,这个修复方法在针对Android 11及以上版本时将无效。 - undefined

0

请求权限成功后,添加以下代码:

android:requestLegacyExternalStorage="true"

在 AndroidManifest.xml 中指定“应用程序”范围

值得注意的是:https://medium.com/androiddevelopers/scope-storage-myths-ca6a97d7ff37 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接