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
相关产品推荐
相关产品推荐

