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

Ionic Cordova Camera插件在Android 13上的调用异常问题

解决Cordova Camera插件在Android 13上返回错误码20的问题

问题分析

错误码20在Cordova Camera插件中通常对应权限缺失或文件访问失败。Android 13的媒体权限模型与旧版本差异较大,即便已声明READ_MEDIA_IMAGES权限,仍可能因插件适配不足、权限申请逻辑缺失或参数配置问题触发该错误。

具体解决方案

1. 升级Camera插件到适配Android 13的版本

旧版本插件未针对Android 13权限规则做适配,执行以下命令升级:

cordova plugin remove cordova-plugin-camera
cordova plugin add cordova-plugin-camera@latest

2. 完善权限配置与动态申请

Android 13要求运行时动态申请权限,仅在config.xml声明不足以生效:

  • 在config.xml中补充权限声明:
<platform name="android">
    <config-file parent="/manifest" target="AndroidManifest.xml">
        <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
        <uses-permission android:name="android.permission.CAMERA" />
        <uses-feature android:name="android.hardware.camera" android:required="false" />
        <uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />
    </config-file>
</platform>
  • 在代码中添加动态权限申请逻辑:
import { Permissions } from '@ionic-native/permissions/ngx';

async requestRequiredPermissions() {
  const cameraPermission = await this.permissions.requestPermission(this.permissions.PERMISSION.CAMERA);
  const mediaPermission = await this.permissions.requestPermission(this.permissions.PERMISSION.READ_MEDIA_IMAGES);
  
  if (cameraPermission.hasPermission && mediaPermission.hasPermission) {
    this.triggerCameraAction(); // 权限通过后调用相机/相册功能
  } else {
    console.log("权限申请失败,无法访问媒体资源");
  }
}

3. 调整Camera参数避免Base64直接转换异常

DATA_URL模式直接将图片转为Base64字符串,大图片易触发内存或权限限制,建议先获取文件URI再手动转Base64:

const options: CameraOptions = {
  quality: 80, // 降低质量减少内存占用
  sourceType: sourceType,
  destinationType: this.camera.DestinationType.FILE_URI, // 先获取文件路径
  encodingType: this.camera.EncodingType.JPEG,
  mediaType: this.camera.MediaType.PICTURE,
  correctOrientation: true
}

this.camera.getPicture(options).then(async (fileUri) => {
  const base64Str = await this.convertFileToBase64(fileUri);
  this.imagePath = 'data:image/jpeg;base64,' + base64Str;
}, (err) => {
  console.log("error taking image: ", err);
});

// 文件URI转Base64方法
convertFileToBase64(fileUri: string): Promise<string> {
  return new Promise((resolve, reject) => {
    window.resolveLocalFileSystemURL(fileUri, (fileEntry) => {
      fileEntry.file((file) => {
        const reader = new FileReader();
        reader.onloadend = () => {
          resolve((reader.result as string).split(',')[1]);
        };
        reader.onerror = reject;
        reader.readAsDataURL(file);
      }, reject);
    }, reject);
  });
}

4. 检查设备端权限设置

部分Android 13设备会默认限制应用的媒体访问权限,手动进入设备的「应用权限设置」,确保当前应用已开启相机和照片/媒体文件的访问权限。

验证步骤

  1. 卸载旧版应用,重新构建并安装
  2. 启动应用后确认权限申请弹窗正常弹出并完成授权
  3. 分别测试相机拍摄和相册选取功能,检查是否生成正常的Base64图片链接

内容的提问来源于stack exchange,提问作者Sparsh Sharma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 16:57:15