uniapp android 11 下载文件问题如何解决?
在uniapp开发中,遇到Android 11系统下载文件失败的问题。具体表现为调用uni.downloadFile下载文件时,部分机型提示权限不足或无法创建文件。已在manifest.json中配置了android:requestLegacyExternalStorage="true",但问题依旧存在。请问该如何兼容Android 11的文件存储权限?是否需要额外配置Scoped Storage或其他解决方案?
在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_WWW或plus.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)处理下载。
总结步骤:
- 检查权限配置。
- 使用
uni.downloadFile下载到临时路径。 - 通过
uni.saveFile保存到应用私有目录(推荐),或按需请求权限保存到公共目录。 - 测试在 Android 11 设备上的兼容性。
通过以上方法,可解决大部分 UniApp 在 Android 11 下载文件的问题。

