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

Android应用从内部存储Documents目录打开PDF文件异常求助

问题修复方案

下面是针对你代码中问题的具体修改点:


1. 修复FileProvider Authorities硬编码问题

你在调用FileProvider.getUriForFile时,硬写了固定的authorities值"com.example.repo.provider1",但Manifest里配置的是${applicationId}.provider1,一旦应用包名改动,这里会出现不匹配,导致权限验证失败。

修改代码:
用当前应用的包名动态拼接authorities:

val fileUri = FileProvider.getUriForFile(this, "${packageName}.provider1", file)

2. 修正Intent Flags的设置方式

直接用flags = Intent.FLAG_GRANT_READ_URI_PERMISSION会覆盖Intent默认的启动flags,可能导致Activity启动异常。应该用添加的方式保留原有flags。

修改代码:

// 替换原有的flags赋值
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)

3. 增加PDF阅读器存在性检查

如果设备上没有安装任何能打开PDF的应用,直接调用startActivity会触发崩溃。必须先判断是否有可处理该Intent的应用。

修改代码:
在启动前添加判断逻辑:

if (intent.resolveActivity(packageManager) != null) {
    startActivity(intent)
} else {
    Toast.makeText(this, "请先安装PDF阅读器", Toast.LENGTH_SHORT).show()
}

4. 可选:适配高版本Android的文件路径获取

Environment.getExternalStorageDirectory()在API 29及以上已被废弃,建议使用标准公共目录API替代,提升兼容性:

// 替换原有的文件路径构建代码
val documentsDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS)
val file = File(documentsDir, fileName)

完整修正后的Activity代码

val fileName = "order5.pdf"
// 适配高版本的公共Documents目录获取
val documentsDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS)
val file = File(documentsDir, fileName)

// 动态获取authorities,避免硬编码
val fileUri = FileProvider.getUriForFile(this, "${packageName}.provider1", file)

val intent = Intent(Intent.ACTION_VIEW).apply {
    setDataAndType(fileUri, "application/pdf")
    // 添加权限flag,保留默认启动flags
    addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
}

// 检查是否有可处理PDF的应用
if (intent.resolveActivity(packageManager) != null) {
    startActivity(intent)
} else {
    Toast.makeText(this, "未找到可打开PDF的应用,请安装PDF阅读器", Toast.LENGTH_SHORT).show()
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 02:35:20