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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 09:13:13