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二次转换,步骤如下:
- 修正URI提取逻辑:从
id.url中剥离多余的外部存储前缀,得到真正的content://格式URI - 直接使用该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
相关产品推荐
相关产品推荐

