Cordova无法将文件保存到安卓设备根目录Download文件夹问题求助
解决方案
一、调整config.xml配置
在<platform name="android">节点下添加/修改以下配置:
- 修正文件系统根路径定位规则:
<preference name="AndroidPersistentFileLocation" value="Compatibility" /> <preference name="AndroidExtraFilesystems" value="files,files-external,documents,sdcard,cache,cache-external,assets,root" />
- 适配安卓10(API 29)的分区存储限制,给应用添加legacy存储权限:
<config-file parent="/manifest/application" target="AndroidManifest.xml"> <application android:requestLegacyExternalStorage="true" /> </config-file>
- 声明所需存储权限:
<!-- 安卓6-12所需权限 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <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" /> <!-- 若安卓11+仍无法访问可添加以下权限,上架谷歌商店需额外说明使用场景 --> <!-- <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" /> -->
二、安装动态权限申请插件
安卓6及以上版本需要动态申请存储权限,仅在清单声明无效,安装cordova安卓权限插件:
cordova plugin add cordova-plugin-android-permissions
三、代码调整
你之前使用的cordova.file.externalDataDirectory是应用私有外部存储目录,仅当前应用可访问,不属于系统公共目录,需要调整为公共Download目录路径。
调整后完整逻辑如下:
// 先申请权限,权限通过后再调用保存方法 function requestPermissionAndSave(fileName, fileData) { const permissions = cordova.plugins.permissions; const permissionList = [ permissions.READ_EXTERNAL_STORAGE, permissions.WRITE_EXTERNAL_STORAGE ]; // 适配安卓13权限 if (device.version >= '13') { permissionList.push(permissions.READ_MEDIA_IMAGES, permissions.READ_MEDIA_VIDEO, permissions.READ_MEDIA_AUDIO); } permissions.requestPermissions(permissionList, function(status) { if (status.hasPermission) { savePDF(fileName, fileData); } else { Swal.fire({ icon: 'error', text: '需要存储权限才能保存文件,请开启权限后重试', showConfirmButton: true }); } }, function() { Swal.fire({ icon: 'error', text: '权限申请失败,请重试', showConfirmButton: true }); }); } // 调整路径后的保存方法 function savePDF(fileName, fileData) { // 替换路径为公共Download目录 window.resolveLocalFileSystemURL(cordova.file.externalRootDirectory + 'Download/', function (dir) { dir.getFile(fileName, { create: true, exclusive: false }, function (fileEntry) { fileEntry.createWriter(function (writer) { writer.onwrite = function (evt) { Swal.fire({ icon: 'success', text: `${fileName} 已保存到Download文件夹`, showConfirmButton: true }); }; writer.write(fileData); }) }, function (err) { console.error('文件创建失败', err); Swal.fire({ icon: 'error', text: '生成pdf失败,请重试', showConfirmButton: true }); }); }, function (err) { console.error('目录访问失败', err); Swal.fire({ icon: 'error', text: '无法访问Download目录,请检查权限', showConfirmButton: true }); }); }
注意事项
- 以上方案仅适用于Cordova环境,若使用Ionic Capacitor替代Cordova,对应API会有差异
- 安卓14及以上版本对公共目录的写入限制更严格,如遇问题可额外添加MANAGE_EXTERNAL_STORAGE权限申请逻辑,引导用户手动开启所有文件访问权限
内容的提问来源于stack exchange,提问作者Matheus Perozini Magalhães
相关产品推荐
相关产品推荐

