uniapp android 11 下载文件问题如何解决?

在uniapp开发中,遇到Android 11系统下载文件失败的问题。具体表现为调用uni.downloadFile下载文件时,部分机型提示权限不足或无法创建文件。已在manifest.json中配置了android:requestLegacyExternalStorage="true",但问题依旧存在。请问该如何兼容Android 11的文件存储权限?是否需要额外配置Scoped Storage或其他解决方案?

2 回复

在Android 11中,由于分区存储限制,需在manifest中配置android:requestLegacyExternalStorage="true",并使用uni.downloadFile保存到临时路径,再通过uni.saveFile保存到用户目录。


在 UniApp 中,Android 11 及以上版本下载文件时,可能会遇到权限或存储路径问题,主要原因是 Android 11 引入了分区存储(Scoped Storage)机制。以下是解决方案:

1. 配置权限

manifest.json 中确保以下权限已添加:

{
  "permissions": {
    "android": [
      "WRITE_EXTERNAL_STORAGE",
      "READ_EXTERNAL_STORAGE"
    ]
  }
}

注意:Android 11 及以上,外部存储权限可能受限,需使用分区存储兼容方式。

2. 使用 UniApp 下载 API

通过 uni.downloadFile 下载文件,并保存到应用私有目录或公共目录:

uni.downloadFile({
  url: 'https://example.com/file.pdf',
  success: (res) => {
    if (res.statusCode === 200) {
      // 保存文件到应用私有目录(无需权限)
      const filePath = plus.io.convertLocalFileSystemURL(res.tempFilePath);
      uni.saveFile({
        tempFilePath: res.tempFilePath,
        success: (saveRes) => {
          uni.showToast({ title: '下载成功', icon: 'success' });
        }
      });
    }
  },
  fail: (err) => {
    console.error('下载失败:', err);
  }
});

3. 适配 Android 11 存储路径

  • 私有目录:使用 plus.io.PRIVATE_WWWplus.io.DOCUMENTS,无需权限。
  • 公共目录:如需保存到 Downloads 等目录,需使用 uni.saveFile 或 Native.js 调用原生 API,但可能需用户手动授权。

4. 处理 MANAGE_EXTERNAL_STORAGE 权限(谨慎使用)

对于特殊需求(如管理所有文件),可在 manifest.json 中添加:

{
  "permissions": {
    "android": [
      "MANAGE_EXTERNAL_STORAGE"
    ]
  }
}

并在代码中动态请求权限(需引导用户手动开启)。

5. 使用插件或原生开发

如果 UniApp API 无法满足,可封装原生模块或使用社区插件(如 uni-save-file-android)处理下载。

总结步骤:

  1. 检查权限配置。
  2. 使用 uni.downloadFile 下载到临时路径。
  3. 通过 uni.saveFile 保存到应用私有目录(推荐),或按需请求权限保存到公共目录。
  4. 测试在 Android 11 设备上的兼容性。

通过以上方法,可解决大部分 UniApp 在 Android 11 下载文件的问题。

回到顶部