You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 15:20:21