使用Cordova-plugin-camera-with-exif 1.5.1获取GPS元数据为null的问题排查
问题详情
基于Quasar 3 TypeScript框架,使用v1.5.1的cordova-plugin-camera-with-exif插件拍摄图片并提取EXIF数据时,可正常获取光圈、拍摄时间等元数据,但所有GPS相关字段均为null。
获取到的元数据示例:
{ "aperture": "2.0", "datetime": "2022:10:27 01:41:55", "exposureTime": "0.120003", "flash": "0", "focalLength": "3500/1000", "gpsAltitude": null, "gpsAltitudeRef": null, "gpsDateStamp": null, "gpsLatitude": null, "gpsLatitudeRef": null, "gpsLongitude": null, "gpsLongitudeRef": null, "gpsProcessingMethod": null, "gpsTimestamp": null, "iso": "807", "make": "motorola", "model": "moto g pro", "orientation": "0", "whiteBalance": "0" }
环境与当前配置:
- Cordova及Cordova Android版本均≥10.1.1
- 设备GPS已开启
- 相机配置:
{ quality: 30, destinationType: Camera.DestinationType.FILE_URI, encodingType: Camera.EncodingType.JPEG, sourceType: Camera.PictureSourceType.CAMERA, mediaType: Camera.MediaType.PICTURE, cameraDirection: Camera.Direction.BACK, correctOrientation: true }
问题排查与修复方案
你确实遗漏了关键配置和权限处理,以下是具体解决步骤:
1. 新增插件专属GPS启用配置
cordova-plugin-camera-with-exif默认不会自动写入GPS信息,需要在相机配置中添加enableLocation: true参数,明确开启GPS元数据写入:
const cameraOptions = { quality: 30, destinationType: Camera.DestinationType.FILE_URI, encodingType: Camera.EncodingType.JPEG, sourceType: Camera.PictureSourceType.CAMERA, mediaType: Camera.MediaType.PICTURE, cameraDirection: Camera.Direction.BACK, correctOrientation: true, enableLocation: true, // 核心配置:开启GPS信息写入 saveToPhotoAlbum: true // 可选:部分设备需保存到相册才能触发GPS元数据写入 };
2. 配置Android权限
Cordova Android 10+及更高版本需要在config.xml中声明必要的位置权限,确保APP能获取设备位置并写入EXIF:
<!-- 基础位置权限 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- Android 12+ 读取媒体位置额外权限 --> <uses-permission android:name="android.permission.ACCESS_MEDIA_LOCATION" />
3. 动态申请权限
Android 6.0+要求动态申请危险权限,需在调用相机前主动申请位置权限,可借助cordova-plugin-android-permissions实现:
import AndroidPermissions from '@awesome-cordova-plugins/android-permissions'; async function prepareTakePhoto() { const requiredPermissions = [ AndroidPermissions.PERMISSION.ACCESS_FINE_LOCATION, AndroidPermissions.PERMISSION.ACCESS_MEDIA_LOCATION ]; const permissionResult = await AndroidPermissions.requestPermissions(requiredPermissions); if (permissionResult.hasPermission) { // 权限通过,调用相机 takePhotoWithExif(); } else { console.error('位置权限被拒绝,无法获取GPS元数据'); // 可添加用户提示,引导前往设置开启权限 } }
4. 额外验证点
- 确认设备设置中,APP已同时开启位置权限和相机权限
- 可先用
cordova-plugin-geolocation获取一次当前坐标,验证GPS模块是否正常工作,排除硬件或系统层面的GPS故障
内容的提问来源于stack exchange,提问作者belhadj haythem
相关产品推荐
相关产品推荐

