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
相关产品推荐
相关产品推荐

