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"
在清单文件的应用程序标签中,如下所示。
请求权限成功后。添加此行:
android:requestLegacyExternalStorage="true"
在 AndroidManifest.xml
中确定“应用程序”的范围
我正在 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"
在清单文件的应用程序标签中,如下所示。
请求权限成功后。添加此行:
android:requestLegacyExternalStorage="true"
在 AndroidManifest.xml
中确定“应用程序”的范围