cordova.file.externalRootDirectory在Android11设备失效无法下载文件如何解决
Cordova Android 11 文件下载失败解决方案
核心问题原因
Android 11(API 30)强制启用分区存储规则,第三方应用默认无法直接读写外部存储根目录,你代码中使用的cordova.file.externalRootDirectory就是外部存储根路径,这是Android 11下运行失败的核心原因。
需要调整的内容
1. 修改文件存储路径
优先选用以下两类合规路径,无需额外申请存储权限即可正常读写:
- 应用专属外部存储路径:
cordova.file.externalDataDirectory,仅本应用可访问,卸载应用时文件会同步删除 - 公共分类存储路径:如果需要文件可被其他应用(如PDF阅读器)访问,使用对应分类的公共目录,例如下载PDF可使用
cordova.file.externalPublicDirectory + 'Download/'
路径修改后的代码示例:
// 示例:存储到公共下载目录 window.resolveLocalFileSystemURL(cordova.file.externalPublicDirectory + 'Download/', function(dir) { dir.getFile("test.pdf", {create:true}, function(file) { file.createWriter(function(fileWriter) { fileWriter.write("byteArrays data"); alert('Message', 'File Downloaded Successfully'); }, function(){ alert('Error!', "Unable to save the file"); }); },function(e){ alert('Error!', e); }); },function(e){ console.log(e); });
2. 调整权限配置
WRITE_EXTERNAL_STORAGE权限在API 30及以上版本已经完全失效,可以直接删除MANAGE_EXTERNAL_STORAGE属于特殊权限,仅文件管理器类应用可申请谷歌商店过审,非必要不建议使用。如果必须全局访问外部存储,除了在AndroidManifest.xml中声明,还需要动态引导用户手动开启权限:
if (parseInt(device.version) >= 11) { cordova.plugins.permissions.checkPermission(cordova.plugins.permissions.MANAGE_EXTERNAL_STORAGE, function(status) { if (!status.hasPermission) { cordova.plugins.intent.startActivity({ action: 'android.settings.MANAGE_APP_ALL_FILES_ACCESS_PERMISSION', uri: 'package:' + cordova.getAppId() }, function() {}, function() {}); } }); }
上述代码需要提前安装cordova-plugin-permissions和cordova-plugin-intent插件。
3. 替换废弃插件
你使用的cordova-plugin-file-transfer已经被官方停止维护,对API 30+适配性极差,建议替换为原生XMLHttpRequest或fetch API实现下载逻辑,配合cordova-plugin-file完成本地文件写入,兼容性更好。
4. 补充Config.xml配置
在现有配置基础上添加AndroidX适配开关:
<preference name="AndroidXEnabled" value="true" />
内容的提问来源于stack exchange,提问作者Maheshvy
相关产品推荐
相关产品推荐

