Android 11 图片功能异常:Apache Cordova-PhoneGap clickPhoto函数升级后失效问题
解决Cordova Camera在Android 11下无法拍照的问题
嘿,这个问题我之前帮同事排查过,根源就是Android 11(API 30)引入的**分区存储(Scoped Storage)**机制——它彻底改变了APP访问文件的规则,而你用的FILE_URI目标类型刚好依赖旧的文件访问逻辑,在Android 11下直接失效了。下面给你一步步的解决方案:
1. 先升级Cordova相机插件到最新版
旧版本的cordova-plugin-camera没适配Android 11的存储规则,先卸载重装最新版:
cordova plugin rm cordova-plugin-camera cordova plugin add cordova-plugin-camera@latest
2. 替换destinationType参数
把Camera.DestinationType.FILE_URI换成适配Android 11的类型,有两个选择:
- 如果只是需要显示图片或者上传base64格式,用
DATA_URL:
function clickPhoto(source) { navigator.camera.getPicture(onPhotoURISuccess, onFail, { quality: 20, destinationType: Camera.DestinationType.DATA_URL }); };
- 如果需要操作文件路径,用
NATIVE_URI(它会返回符合分区存储规则的content://格式URI):
function clickPhoto(source) { navigator.camera.getPicture(onPhotoURISuccess, onFail, { quality: 20, destinationType: Camera.DestinationType.NATIVE_URI }); };
3. 配置Android权限和目标SDK版本
在你的config.xml里添加适配Android 11的权限,同时把目标SDK升到30以上(建议用最新的33):
<platform name="android"> <!-- Android 11+ 读取图片权限 --> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> <!-- 兼容Android 10及以下的存储权限 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="29" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="29" /> <!-- 设置目标SDK版本 --> <preference name="android-targetSdkVersion" value="33" /> </platform>
4. 适配onPhotoURISuccess处理逻辑
如果用了NATIVE_URI,返回的是content://开头的URI,不能直接像旧文件路径那样使用,需要配合cordova-plugin-file来读取文件:
function onPhotoURISuccess(imageURI) { // 解析content URI为FileEntry window.resolveLocalFileSystemURL(imageURI, function(fileEntry) { fileEntry.file(function(file) { var reader = new FileReader(); reader.onloadend = function() { // 这里可以拿到base64格式的图片数据,用于显示或上传 var imgElement = document.getElementById('your-image-element'); imgElement.src = this.result; }; reader.readAsDataURL(file); }, onFail); }, onFail); }
这样调整后,你的拍照功能就能在Android 11及以上正常工作了。
内容的提问来源于stack exchange,提问作者Aksheet-Goku
相关产品推荐
相关产品推荐

