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

Android 13无法获取PDF文件问题(代码在Android 12正常运行)

Android 13无法获取PDF文件的解决方案

问题原因

你的代码在Android 12及以下正常运行,但Android 13(API 33)中失效,核心原因:

  • Android 13开始限制对MediaStore.Files.FileColumns.DATA字段的直接访问,该字段返回的文件路径不再有效,直接读取会导致无法获取文件信息
  • Android 10及以上引入的沙箱存储机制,也不推荐通过本地文件路径直接访问外部存储文件

修改后的实现代码

TYPE.DOCUMENT -> {
    val uri = MediaStore.Files.getContentUri("external")
    // 仅查询需要的字段,避免冗余数据
    val projection = arrayOf(
        MediaStore.Files.FileColumns._ID,
        MediaStore.Files.FileColumns.DISPLAY_NAME,
        MediaStore.Files.FileColumns.MIME_TYPE
    )
    val mimeTypeSelection = MediaStore.Files.FileColumns.MIME_TYPE + " IN (" + fileExtensions.joinToString(",") { "'application/$it'" } + ")"
    
    // 适配不同Android版本的文件夹筛选逻辑
    val selection = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        // Android 10及以上使用RELATIVE_PATH替代DATA字段
        "${MediaStore.Files.FileColumns.RELATIVE_PATH} LIKE '%$folderName/%' AND $mimeTypeSelection"
    } else {
        "${MediaStore.Files.FileColumns.DATA} LIKE '%/$folderName/%' AND $mimeTypeSelection"
    }

    val cursor = contentResolver.query(uri, projection, selection, null, null)

    if (cursor == null) {
        showErrorMessage("Failed to retrieve documents: cursor is null.")
    } else {
        val idColumn = cursor.getColumnIndex(MediaStore.Files.FileColumns._ID)
        val displayNameColumn = cursor.getColumnIndex(MediaStore.Files.FileColumns.DISPLAY_NAME)
        
        while (cursor.moveToNext()) {
            val fileId = cursor.getLong(idColumn)
            // 通过文件ID构建Content URI,替代直接路径访问
            val fileUri = ContentUris.withAppendedId(MediaStore.Files.getContentUri("external"), fileId)
            val displayName = cursor.getString(displayNameColumn)
            
            // 建议存储Content URI而非本地路径,后续通过ContentResolver操作文件
            docList.add(fileUri.toString())
            // 示例:通过URI打开文件输入流
            // val inputStream = contentResolver.openInputStream(fileUri)
        }
        cursor.close()
    }
}

关键注意事项

  • 权限适配:Android 13及以上,访问媒体文件需申请READ_MEDIA_IMAGES/READ_MEDIA_VIDEO/READ_MEDIA_AUDIO;若访问非媒体目录的PDF,建议使用**存储访问框架(SAF)**让用户主动选择文件/文件夹,避免权限问题
  • 路径替代方案:不再依赖本地文件路径,改用Content URI通过ContentResolver操作文件,适配沙箱存储
  • 文件夹筛选:Android 10及以上用RELATIVE_PATH字段筛选文件夹,该字段返回相对存储根目录的路径(如Download/MyFolder/)

内容的提问来源于stack exchange,提问作者PRAVEEN KUMAR P

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 10:32:12