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

Kotlin中使用FileProvider打开URI后出现黑屏问题求助

问题分析与解决方案

核心问题

你错误地将**内容URI(content://开头)**当成了外部存储下的文件路径来处理,导致生成的FileProvider URI完全无效,Acrobat Reader找不到实际的PDF文件,因此出现黑屏。

具体来看:

  • 你存储的合法URI是content://com.android.providers.media.documents/document/document:1000013000,但代码里的id.url却多了/storage/emulated/0/前缀,变成了/storage/emulated/0/content:/...
  • 你用这个错误的路径构造File对象,再通过FileProvider生成新的URI,最终的URI指向一个根本不存在的文件,自然无法被Acrobat正确读取。

解决方案

直接使用存储的合法内容URI,无需通过File和FileProvider二次转换,步骤如下:

  1. 修正URI提取逻辑:从id.url中剥离多余的外部存储前缀,得到真正的content://格式URI
  2. 直接使用该URI启动Intent:给目标APP授予读取权限,确保它能访问内容URI指向的文件

修正后的代码

private fun openFile(id: FileData) {
    // 提取真正的content URI:去掉开头的/storage/emulated/0/前缀
    val realContentUriStr = id.url.replace("/storage/emulated/0/", "")
    val contentUri = Uri.parse(realContentUriStr)

    val pdfOpenIntent = Intent(Intent.ACTION_VIEW).apply {
        flags = Intent.FLAG_ACTIVITY_CLEAR_TOP
        addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
        setDataAndType(contentUri, "application/pdf")
    }

    // 确保权限被正确授予(针对Android 10+)
    val resInfoList = packageManager.queryIntentActivities(pdfOpenIntent, PackageManager.MATCH_DEFAULT_ONLY)
    for (resolveInfo in resInfoList) {
        val packageName = resolveInfo.activityInfo.packageName
        grantUriPermission(packageName, contentUri, Intent.FLAG_GRANT_READ_URI_PERMISSION)
    }

    startActivity(pdfOpenIntent)
}

额外说明

  • FileProvider的作用是将本地文件路径转换为其他APP可访问的content URI,而你手里已经是系统媒体提供者返回的合法content URI,完全不需要再用FileProvider处理
  • 如果存储id.url时就错误地添加了外部存储前缀,建议同时修正存储逻辑,直接存储原始的content:// URI,避免后续处理麻烦

内容的提问来源于stack exchange,提问作者joj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 06:51:18