You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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权限
  • 确保动态权限申请流程正确,用户已授予权限

额外排查点

  1. 查看Log打印的文件名,确认是否有PDF文件被遍历到:
    • 如果Log中能看到PDF文件名但未被添加到列表,可将判断逻辑改为正则匹配,避免大小写或后缀格式问题:
      if (file.isFile() && file.getName().toLowerCase().matches(".*\\.pdf$")) {
          pdfFilesList.add(file);
      }
      
  2. 确认PDF文件所在目录:
    应用私有目录(如Android/data/你的包名/)不受分区存储限制,若PDF在这类目录中,原代码应能正常读取。

内容的提问来源于stack exchange,提问作者H M Danish

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 10:50:55