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设备会默认限制应用的媒体访问权限,手动进入设备的「应用权限设置」,确保当前应用已开启相机和照片/媒体文件的访问权限。
验证步骤
- 卸载旧版应用,重新构建并安装
- 启动应用后确认权限申请弹窗正常弹出并完成授权
- 分别测试相机拍摄和相册选取功能,检查是否生成正常的Base64图片链接
内容的提问来源于stack exchange,提问作者Sparsh Sharma
相关产品推荐
相关产品推荐

