Android 14下Ionic Angular Cordova应用调用相机崩溃问题求助
解决Android 14上Ionic Angular应用调用相机崩溃的问题
根据你提供的环境和错误信息,问题源于Android 14的权限变更、相机插件兼容性以及主线程阻塞限制,以下是具体解决步骤:
升级相机插件到兼容Android 14的版本
当前使用的cordova-plugin-camera@7.0.0对Android 14适配不完善,优先升级到最新稳定版:# 移除旧插件 cordova plugin remove cordova-plugin-camera # 安装最新版 cordova plugin add cordova-plugin-camera@latest # 同步更新awesome插件 npm install @awesome-cordova-plugins/camera@latest适配Android 14的权限要求
Android 14废弃了旧的READ_EXTERNAL_STORAGE权限,改用READ_MEDIA_IMAGES,需要在config.xml中添加权限配置:<platform name="android"> <config-file parent="/manifest" target="AndroidManifest.xml" xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 相机权限 --> <uses-permission android:name="android.permission.CAMERA" /> <!-- Android 14 媒体读取权限 --> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> </config-file> </platform>代码中请求权限时,需针对Android版本判断,优先请求
READ_MEDIA_IMAGES而非旧存储权限。优化相机调用参数
避免使用可能导致主线程阻塞的配置:- 优先使用
destinationType: this.camera.DestinationType.NATIVE_URI替代DATA_URL,减少内存占用和线程阻塞 - 关闭不必要的
allowEdit等耗时操作
示例调用:
const options: CameraOptions = { quality: 80, destinationType: this.camera.DestinationType.NATIVE_URI, encodingType: this.camera.EncodingType.JPEG, mediaType: this.camera.MediaType.PICTURE, correctOrientation: true }; this.camera.getPicture(options).then((imageData) => { // 处理图片逻辑 }, (err) => { console.error(err); });- 优先使用
手动修复主线程阻塞问题(若升级插件后仍存在)
日志中的THREAD WARNING提示插件在主线程执行耗时操作,若升级后仍有问题,可修改插件源码:
找到插件目录下的src/android/Camera.java,将takePicture的逻辑放到线程池执行:// 替换原exec方法中的takePicture逻辑 cordova.getThreadPool().execute(new Runnable() { @Override public void run() { // 原takePicture的代码逻辑 } });
内容的提问来源于stack exchange,提问作者Limango
相关产品推荐
相关产品推荐

