Android 11下Cordova应用拍照裁剪后无权限无法保存图片问题求助
Cordova Android 9 相机裁剪报“访问被拒绝无法保存裁剪图片”的解决方案
高频踩坑原因
- 权限标签位置错误:你当前
AndroidManifest.xml里所有<uses-permission>都嵌套在了<application>标签内部。这类权限配置必须和<application>同级、放在<manifest>根节点下才会被系统识别,嵌套在内部的配置完全不生效,等于白写。 - 旧版相机插件的固有兼容bug:
cordova-plugin-camera@4.0.3调用系统裁剪功能时,默认把裁剪输出文件写到公共外部存储的Pictures目录,就算开了requestLegacyExternalStorage,系统裁剪模块(自带图库、第三方裁剪App)也不会继承你应用的Legacy存储权限,写公共目录时会被系统分区存储机制直接拦截,触发保存失败。 - 无效权限申请:
MANAGE_EXTERNAL_STORAGE是Android 11(API 30)才引入的权限,你当前设置targetSdkVersion 29,系统根本不会识别这个权限,申请了也没有任何作用。
可落地的操作步骤
- 修正
AndroidManifest.xml结构:把所有<uses-permission>标签从<application>内部移到根<manifest>节点下,和<application>标签完全同级;在<application>标签本身加上android:requestLegacyExternalStorage="true"属性,别把这个属性放错位置。 - 更新相机插件版本:在
config.xml里把cordova-plugin-camera从^4.0.3升级到4.x分支的最后一个稳定版4.1.2,这个版本已经修复了裁剪时写公共存储被拦截的bug,会自动把裁剪临时文件落到应用私有目录,不用手动改路径。 - 动态申请运行时权限:首次调用相机、裁剪流程前,用已经安装的
cordova-plugin-android-permissions检查并申请CAMERA、READ_EXTERNAL_STORAGE、WRITE_EXTERNAL_STORAGE的运行时授权,别等裁剪流程触发了才因为没权限报错。注意WRITE_EXTERNAL_STORAGE在Android 11及以上会被系统自动忽略,但在Android 9及以下版本还是需要正常申请的,别随便删掉这个权限。 - 调整相机调用参数:调用
navigator.camera.getPicture时,把saveToPhotoAlbum设为false,destinationType设为Camera.DestinationType.FILE_URI,不要强制要求把裁剪后的图保存到公共相册目录,从根源上避免跨应用写公共目录被拦截的问题。
没必要浪费时间试的无效方案
- 单独申请
MANAGE_EXTERNAL_STORAGE权限,target29下完全不生效 - 调低
targetSdkVersion到28以下绕过分区存储,现在应用市场上架都要求最低target30+,降版本会带来更多兼容问题 - 修改系统裁剪App的存储权限,这个权限属于第三方应用本身,和你的App无关,改了也解决不了跨应用写公共目录的拦截问题
内容的提问来源于stack exchange,提问作者Владимир Строюк
相关产品推荐
相关产品推荐

