如何在IONIC Cordova中向Android 13存储写入PDF文件
解决Ionic Cordova项目在Android 10+上的文件存储问题
问题根源
Android 10(API 29)引入了**分区存储(Scoped Storage)**机制,限制了应用对外部存储公共目录的直接访问,旧代码中硬编码的传统存储路径(如file:///sdcard/)在Android 10+设备上会被系统拦截,导致文件操作失效。
具体解决方案
1. 更新Cordova文件插件
确保使用适配了分区存储的最新版cordova-plugin-file,执行以下命令更新:
cordova plugin remove cordova-plugin-file && cordova plugin add cordova-plugin-file@latest
2. 配置AndroidManifest.xml权限
修改项目根目录下的config.xml,添加Android版本对应的存储权限和兼容配置:
<platform name="android"> <!-- 让Android 10设备兼容旧存储逻辑 --> <edit-config file="AndroidManifest.xml" mode="merge" target="/manifest/application"> <application android:requestLegacyExternalStorage="true" /> </edit-config> <!-- Android 10以下读写权限 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28" /> <!-- Android 11+ 管理外部存储权限(仅当需要访问公共目录时添加) --> <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" android:minSdkVersion="30" /> </platform>
3. 使用Cordova提供的合法存储路径
避免硬编码存储路径,改用插件提供的API获取应用专属存储目录,示例代码:
// 获取应用专属外部存储目录 window.resolveLocalFileSystemURL(cordova.file.externalDataDirectory, function(dir) { // 创建或获取目标文件 dir.getFile('demo.txt', {create: true, exclusive: false}, function(fileEntry) { // 写入文件示例 fileEntry.createWriter(function(writer) { writer.onwriteend = function() { console.log('文件写入成功'); }; writer.write('测试内容'); }, function(error) { console.error('创建写入器失败:', error); }); }, function(error) { console.error('获取文件失败:', error); }); }, function(error) { console.error('获取目录失败:', error); });
cordova.file.externalDataDirectory是应用的专属外部存储目录,Android 10+无需额外权限即可读写,数据会随应用卸载而删除。
4. Android 11+ 公共目录访问处理
如果必须访问公共目录(如Downloads、Pictures),需要申请MANAGE_EXTERNAL_STORAGE权限,并引导用户手动开启:
if (cordova.platformId === 'android' && parseInt(window.device.version) >= 11) { cordova.plugins.permissions.requestPermission(cordova.plugins.permissions.MANAGE_EXTERNAL_STORAGE, function(status) { if (status.hasPermission) { // 权限已获取,执行公共目录文件操作 } else { // 提示用户前往系统设置开启权限 alert('需要开启存储管理权限才能访问公共目录,请前往设置开启'); } }, function(error) { console.error('请求权限失败:', error); }); }
注意:该权限无法通过应用内弹窗直接授权,必须引导用户到系统设置的应用权限页面手动开启。
内容的提问来源于stack exchange,提问作者Umar Shahzad
相关产品推荐
相关产品推荐

