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

cordova-plugin-zip在Android12/13失效(原Android8正常)求助

解决方案:Cordova 12 + Android 12/13 下 cordova-plugin-zip 解压返回 status -1 问题

核心原因

Android 12+ 启用了分区存储(Scoped Storage),废弃了旧的READ_EXTERNAL_STORAGE/WRITE_EXTERNAL_STORAGE权限规则,同时旧版本cordova-plugin-zip@3.1.0未适配新的存储机制,导致权限验证失败或路径访问受限。


分步解决方法

1. 优先使用应用私有目录(推荐)

应用私有目录(如cordova.file.dataDirectory、cordova.file.cacheDirectory)不需要任何存储权限,完全规避分区存储限制,是最稳妥的方案:

  • 将待解压的zip文件迁移到私有目录
  • 解压目标路径也设置为私有目录下的子文件夹

修改后的代码示例:

export async function decompressService() {
    return new Promise((resolve) => {
        // 使用应用私有目录路径(替换你原来的公共路径)
        const zipSource = cordova.file.dataDirectory + decompressionFileData.zipFileName;
        const unzipTarget = cordova.file.dataDirectory + "unpacked_files/";

        window.zip.unzip(
            zipSource,
            unzipTarget,
            (status) => {
                if (status === 0) {
                    const deletionData = {
                        destinationURIFolder: unzipTarget,
                        destinationURIFile: zipSource
                    };
                    resolve(deletionData);
                } else {
                    console.error(`解压失败,状态码:${status}`);
                    resolve(null);
                }
            },
            (progress) => {
                const percentage = Math.round((progress.loaded / progress.total) * 100);
                console.log(`解压进度:${percentage}%`);
            }
        );
    });
}

2. 适配公共目录的权限规则(仅当必须访问公共目录时)

如果业务需要操作公共存储目录,需按Android 12+的权限要求适配:

  • Android 12(API 32):仍需申请READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE,需在config.xml中声明:
    <platform name="android">
        <config-file parent="/manifest" target="AndroidManifest.xml">
            <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
            <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
        </config-file>
    </platform>
    
  • Android 13+(API 33):需申请细分权限(如READ_MEDIA_IMAGES、READ_MEDIA_VIDEO等),或申请MANAGE_EXTERNAL_STORAGE(需用户手动在设置中授权,不推荐常规场景使用)

使用cordova.plugins.diagnostic提前申请权限:

export async function decompressService() {
    return new Promise(async (resolve) => {
        // 检查并申请权限
        let hasPermission = false;
        const androidVersion = parseInt(device.version);
        if (androidVersion <= 12) {
            hasPermission = await cordova.plugins.diagnostic.hasExternalStoragePermission();
            if (!hasPermission) {
                hasPermission = await cordova.plugins.diagnostic.requestExternalStoragePermission();
            }
        } else {
            // Android 13+ 按需申请对应媒体权限
            hasPermission = await cordova.plugins.diagnostic.hasReadMediaImagesPermission();
            if (!hasPermission) {
                hasPermission = await cordova.plugins.diagnostic.requestReadMediaImagesPermission();
            }
        }

        if (!hasPermission) {
            console.error("存储权限被拒绝");
            resolve(null);
            return;
        }

        // 原有解压逻辑
        window.zip.unzip(
            decompressionFileData.destinationURI,
            decompressionFileData.destinationURIFolder,
            (status) => {
                if (status === 0) {
                    const deletionData = {
                        destinationURIFolder: decompressionFileData.destinationURIFolder,
                        destinationURIFile: decompressionFileData.destinationURIFile
                    };
                    resolve(deletionData);
                } else {
                    console.error(`解压失败,状态码:${status}`);
                    resolve(null);
                }
            },
            (progress) => {
                const percentage = Math.round((progress.loaded / progress.total) * 100);
                console.log(`解压进度:${percentage}%`);
            }
        );
    });
}

3. 升级 cordova-plugin-zip 到兼容版本

旧版本3.1.0未适配Android 12+的存储机制,升级到最新版可解决大部分兼容性问题:

cordova plugin remove cordova-plugin-zip
cordova plugin add cordova-plugin-zip@latest

4. 调试定位具体错误

status -1 是通用错误码,可通过以下方式获取详细原因:

  • 在Android Studio中连接设备,查看Logcat日志,过滤ZipPlugin关键词,获取具体的异常信息(如文件不存在、权限被拒、路径无效等)
  • 在解压回调中添加更详细的日志输出,辅助排查

内容的提问来源于stack exchange,提问作者Alan Alvarez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 06:00:32