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

Vue+Capacitor混合应用html2pdf导出PDF Android报EACCES权限错误求助

问题解决步骤

1. 适配Android不同版本的存储权限配置

你当前的权限配置仅适配Android 12及以下系统,Android 13及以上版本废弃了WRITE_EXTERNAL_STORAGE权限,需要修改AndroidManifest.xml的权限声明:

<!-- 安卓12及以下适用 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
<!-- 安卓13及以上适用 -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
<!-- 如需访问公共目录的所有文件可添加,Google Play上架需要说明使用场景 -->
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />

<!-- 在application节点添加以下属性适配安卓10存储兼容 -->
<application
  android:requestLegacyExternalStorage="true"
  ...
>

2. 修正权限判断逻辑

原代码中直接判断if (permission)的逻辑不准确,需要明确校验存储权限的授权状态:

Filesystem.requestPermissions().then( permissionStatus => {
  // 只有publicStorage状态为granted才是获得了存储权限
  if (permissionStatus.publicStorage === 'granted') {
    this.writeCapacitorFile(pdf)
      .then(() => {
        this.$store.dispatch('setLoading', false, { root: true })
        this.$toast.success("Enregistré dans vos documents !")
      })
      .catch(error  => {
        console.log(error)
        this.$toast.error("Vidda n'a pas la permission d'accéder à vos documents")
      })
  } else {
    this.$store.dispatch('setLoading', false, { root: true })
    this.$toast.error("未获得存储权限,无法保存PDF")
  }
})

3. 修正PDF文件写入逻辑

html2pdf输出的PDF是二进制格式,原代码用Encoding.UTF8写二进制文件会导致文件损坏或写入失败,需要先将二进制内容转成base64再写入:

async writeCapacitorFile(pdf) {
  try {
    // 将二进制PDF转为base64格式
    const base64Pdf = btoa(
      new Uint8Array(pdf)
        .reduce((data, byte) => data + String.fromCharCode(byte), '')
    )
    await Filesystem.writeFile({
      path: `${this.patient.patientId}.pdf`,
      data: base64Pdf,
      directory: Directory.Documents
      // 移除Encoding.UTF8配置,二进制文件无需指定文本编码
    })
    return true
  } catch (error) {
    console.error('写文件失败:', error)
    throw error
  }
}

4. 无权限替代方案

如果不需要让用户直接在系统文件管理器的公共Documents目录找到PDF,可以将存储目录改为App专属目录Directory.Data或Directory.Cache,这两个目录写入不需要申请任何存储权限,不会出现权限报错,如果需要分享文件给用户可以调用Capacitor的Share插件完成分享。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 00:54:05