Android无法读取手机存储PDF文件求助(其他格式读取正常)
问题分析与解决方案
你的代码逻辑本身没有语法错误,但无法读取PDF文件的核心原因大概率是Android 10(API 29)及以上的分区存储(Scoped Storage)限制——即使你申请了读写权限,File API也无法直接访问外部存储的公共目录(如Downloads、Documents)中的文档类文件,而图片、音视频因为MediaStore的适配逻辑,可能刚好能被你的其他功能正常读取。
以下是两种可行的解决方案:
方案一:使用MediaStore查询PDF文件(推荐,符合现代Android存储规范)
直接通过ContentResolver查询系统媒体库中的PDF文件,无需遍历目录,适配分区存储规则:
private List<File> getAllPDFFiles(Context context) { List<File> pdfFiles = new ArrayList<>(); String[] projection = { MediaStore.Files.FileColumns._ID, MediaStore.Files.FileColumns.DATA, MediaStore.Files.FileColumns.DISPLAY_NAME }; // 指定查询PDF类型的文件 String selection = MediaStore.Files.FileColumns.MIME_TYPE + " = ?"; String[] selectionArgs = {"application/pdf"}; Cursor cursor = context.getContentResolver().query( MediaStore.Files.getContentUri("external"), projection, selection, selectionArgs, null ); if (cursor != null) { while (cursor.moveToNext()) { String filePath = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.DATA)); File file = new File(filePath); if (file.exists()) { pdfFiles.add(file); } } cursor.close(); } return pdfFiles; }
权限说明:
- Android 13+:需申请
READ_MEDIA_DOCUMENTS权限 - Android 12及以下:需申请
READ_EXTERNAL_STORAGE权限 - 动态权限申请不可少,确保用户已授予对应权限
方案二:过渡方案——绕过分区存储限制(不推荐长期使用)
如果坚持使用原有的File遍历逻辑,可在AndroidManifest.xml的<application>标签中添加属性,强制应用使用旧存储模型:
<application ... android:requestLegacyExternalStorage="true"> </application>
同时检查权限完整性:
- Android 13+额外申请
READ_MEDIA_DOCUMENTS权限 - 确保动态权限申请流程正确,用户已授予权限
额外排查点
- 查看Log打印的文件名,确认是否有PDF文件被遍历到:
- 如果Log中能看到PDF文件名但未被添加到列表,可将判断逻辑改为正则匹配,避免大小写或后缀格式问题:
if (file.isFile() && file.getName().toLowerCase().matches(".*\\.pdf$")) { pdfFilesList.add(file); }
- 如果Log中能看到PDF文件名但未被添加到列表,可将判断逻辑改为正则匹配,避免大小写或后缀格式问题:
- 确认PDF文件所在目录:
应用私有目录(如Android/data/你的包名/)不受分区存储限制,若PDF在这类目录中,原代码应能正常读取。
内容的提问来源于stack exchange,提问作者H M Danish
相关产品推荐
相关产品推荐

