Cordova 12适配Android 13时WRITE_EXTERNAL_STORAGE权限重复问题咨询
解决Cordova 12 + Android 13目标SDK下WRITE_EXTERNAL_STORAGE权限冲突问题
问题根源:不是清单合并工具的Bug
这是两个插件针对Android版本的权限声明不一致导致的冲突:
- cordova-plugin-camera插入的
WRITE_EXTERNAL_STORAGE无版本限制,未适配Android 13的权限变更规则 - cordova-plugin-media-capture插入的权限带有
android:maxSdkVersion="32",符合Android官方要求(Android 13及以上已废弃该权限)
清单合并工具会将这两个权限条目判定为重复(名称相同但属性不同),因此抛出构建错误。
功能影响分析
手动移除media-capture的权限条目后,Android 12及以下设备会丢失WRITE_EXTERNAL_STORAGE权限,可能导致媒体捕获后的存储操作失败;但Android 13+设备不受影响,因为该权限已被废弃,插件通常会自动添加READ_MEDIA_IMAGES、READ_MEDIA_VIDEO等细分权限来替代。
不影响功能的规避方案
方案1:用Manifest覆盖强制统一权限声明
在项目的platforms/android/app/src/main/AndroidManifest.xml中添加以下代码,强制替换所有插件插入的同名权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" tools:node="replace" />
tools:node="replace"会让清单合并工具用这条声明替换所有插件自带的WRITE_EXTERNAL_STORAGE权限,直接消除冲突- 这条声明确保Android 12及以下设备正常获取存储权限,Android 13+设备自动忽略该权限,完全符合系统规则
方案2:升级插件到适配Android 13的版本
检查并升级两个插件到最新稳定版:
cordova plugin remove cordova-plugin-camera && cordova plugin add cordova-plugin-camera@latest cordova plugin remove cordova-plugin-media-capture && cordova plugin add cordova-plugin-media-capture@latest
新版本的插件已经适配了Android 13的权限体系,会自动处理WRITE_EXTERNAL_STORAGE的版本限制,不会出现权限冲突。
方案3:用构建Hook脚本自动修改插件Manifest
如果暂时无法升级插件,可以编写Cordova构建Hook脚本,在构建前自动清理冲突的权限条目:
- 在项目根目录创建
hooks/before_build/01_fix_permissions.js文件 - 写入以下代码(需根据插件实际目录结构调整路径):
const fs = require('fs'); const path = require('path'); module.exports = function(context) { const manifestPath = path.join(context.opts.projectRoot, 'plugins', 'cordova-plugin-media-capture', 'src', 'android', 'AndroidManifest.xml'); if (fs.existsSync(manifestPath)) { let content = fs.readFileSync(manifestPath, 'utf8'); // 删除带maxSdkVersion的WRITE_EXTERNAL_STORAGE权限 content = content.replace(/<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32"\/>/g, ''); fs.writeFileSync(manifestPath, content, 'utf8'); } };
- 给脚本添加执行权限:
chmod +x hooks/before_build/01_fix_permissions.js
这个脚本会在每次构建前自动处理冲突权限,避免手动修改的麻烦。
总结
这种情况是插件权限适配不统一导致的,并非清单合并工具的Bug。推荐优先使用方案1或方案2,既能解决构建冲突,又能保证各版本Android设备的功能正常。
内容的提问来源于stack exchange,提问作者jmelvin
相关产品推荐
相关产品推荐

