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

Android 12小米11 Ultra加载PDF报EACCES权限拒绝问题求解

问题背景
  • 设备环境:运行Android 12系统的小米11 Ultra,其余测试机型功能均正常
  • 报错信息:打开已下载的PDF文件时触发open failed: EACCES (Permission denied)错误
  • 技术实现:通过DownloadManager实现PDF下载,使用com.github.barteksc:android-pdf-viewer:3.2.0-beta.1加载PDF,下载完成后调用binding.pdfView.fromFile(response.data)传入File对象加载,错误在onError回调中抛出
  • 已排查项:已实现完整运行时权限申请逻辑,涉事用户已手动开启应用所有相关权限

根因定位

该问题是MIUI系统专属存储限制+代码实现隐患共同导致:

  1. 代码中使用setDestinationInExternalFilesDir将PDF存到应用外部专属存储的Download目录,MIUI Android 12版本对该目录的非应用主进程访问(PDF库的原生渲染层、独立渲染组件访问)做了额外拦截,即使是应用自身目录下的文件,非主进程访问也会被拒绝
  2. 路径拼接存在逻辑隐患:手动拼接路径字符串时未处理文件分隔符,部分MIUI版本上getExternalFilesDir返回的路径末尾无分隔符,会导致生成的文件路径异常,读取时触发权限错误
  3. 使用的PDF库版本为beta测试版,内部文件读取逻辑未适配MIUI的权限规则,直接传入File对象时会走原生层直接读存储的逻辑,绕过了应用的权限上下文

修复方案

按优先级从高到低选择:

方案1:转存文件到内部缓存目录加载(改造成本最低,适配成功率最高)

  1. 修复路径拼接逻辑,弃用字符串直接拼接,使用File双参数构造器避免分隔符问题:
// 原错误写法
val file = File("${this@FileHelper.context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)}${this@FileHelper.currentFileName}")
// 修改为
val downloadDir = this@FileHelper.context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)
val file = File(downloadDir, this@FileHelper.currentFileName)
  1. 下载完成后,将PDF文件拷贝到应用内部缓存目录,再传给PDF库加载,彻底绕开MIUI的外部存储访问限制:
if (response.status && response.data != null) {
    this.file = response.data
    // 拷贝到内部缓存目录
    val cachePdf = File(cacheDir, response.data.name)
    response.data.copyTo(cachePdf, overwrite = true)
    binding.pdfView.fromFile(cachePdf)
        .onError {
            // 原有错误上报、页面跳转逻辑保持不变
        }
        .load()
}
  1. 清理AndroidManifest中的无效配置:删除<uses-permission android:name="android.permission.FLAG_GRANT_READ_URI_PERMISSION" />,该值是Intent的Flag常量,不是系统权限,不需要在清单中声明。

方案2:使用Uri方式加载替代File直接加载

如果不想做文件拷贝,可以通过FileProvider为下载的PDF生成content类型Uri,调用PDF库的fromUri方法加载:

  1. 在AndroidManifest中配置FileProvider,添加对应路径规则
  2. 下载完成后调用FileProvider.getUriForFile()生成带读取权限的Uri
  3. 调用binding.pdfView.fromUri(uri).load()完成加载,该方式走系统统一的Uri授权机制,MIUI不会拦截合法的自身文件访问请求。

方案3:升级PDF库到稳定版本

当前使用的3.2.0-beta.1为测试版本,后续正式版修复了多机型上原生层读取文件的权限适配问题,可升级到稳定版后验证问题是否复现。


内容的提问来源于stack exchange,提问作者Ergun Ugur Guner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 00:51:21