为什么调用listFiles()方法仅返回文件夹不返回文件
解决方案
1. 适配分区存储权限
该问题绝大多数场景由安卓分区存储权限限制导致:
- API 级别 ≤ 32:在
AndroidManifest.xml中声明READ_EXTERNAL_STORAGE权限,同时在代码中运行时动态申请该权限 - API 级别 ≥ 33:根据要读取的文件类型声明对应权限:读取图片用
READ_MEDIA_IMAGES、读取视频用READ_MEDIA_VIDEO、读取音频用READ_MEDIA_AUDIO。如果需要读取Download目录下的非媒体文件(如APK、PDF、压缩包等),无法通过普通权限获取访问权限,需调用系统存储访问框架(SAF)实现 - 注意:
targetSdkVersion ≥ 29时在清单文件配置android:requestLegacyExternalStorage="true"仅能在安卓10设备上临时绕过分区存储限制,安卓11及以上系统会完全忽略该配置
2. 修正公共目录获取方式
不要硬编码/sdcard/Download路径,不同厂商ROM的公共目录路径可能存在定制化差异,应使用官方API获取公共Download目录的正确路径:
File downloadDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); File[] list = downloadDir.listFiles(); if(list!=null) { Log.e("exists",downloadDir.exists()+""); Log.e("isDirectory",downloadDir.isDirectory()+""); Log.e("getPath",downloadDir.getPath() +""); Log.e("length",list.length+""); for (File fil : list) { Log.e("name", fil.getName()); } }
3. 检查文件属性限制
如果目标文件是其他应用创建的私有文件、或者被设置了隐藏/系统文件属性,没有对应访问权限的情况下也会被listFiles()方法自动过滤不返回。
内容的提问来源于stack exchange,提问作者Pavel Andorel
相关产品推荐
相关产品推荐

