使用image_picker拍摄的照片无GPS元数据,图库图片却存在该数据
问题解决:image_picker相机拍照无GPS元数据
问题场景
使用image_picker组件实现拍照和图库选图功能,设备(小米Redmi Note 8T,Android 10)已开启相机保存位置,但应用内拍摄的照片始终没有GPS GPSLatitude元数据,而从图库选取的照片正常包含位置信息。
核心原因
- 权限缺失:Android 10及以上系统,拍摄带位置的照片需要位置权限(
ACCESS_FINE_LOCATION/ACCESS_COARSE_LOCATION)和媒体位置权限(ACCESS_MEDIA_LOCATION),image_picker不会自动请求这些权限。 - 相机配置未启用位置标记:默认调用相机时,没有开启保存位置的配置项,导致照片不写入GPS元数据。
解决方案
1. 添加权限到AndroidManifest.xml
在android/app/src/main/AndroidManifest.xml中添加以下权限:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_MEDIA_LOCATION" />
2. 动态申请位置权限
使用permission_handler库(需先在pubspec.yaml添加依赖)请求位置权限:
import 'package:permission_handler/permission_handler.dart'; Future<bool> checkAndRequestLocationPermission() async { PermissionStatus status = await Permission.location.request(); if (status.isGranted) { return true; } else { // 可提示用户前往设置开启权限 return false; } }
3. 配置拍照选项启用位置保存
调用pickImage时,通过CameraOptions开启Android端的位置保存:
final picker = ImagePicker(); // 先检查权限再拍照 if (await checkAndRequestLocationPermission()) { final XFile? image = await picker.pickImage( source: ImageSource.camera, cameraOptions: const CameraOptions( android: AndroidCameraOptions( saveLocation: true, ), ), ); if (image != null) { final metadata = await readExifFromBytes(File(image.path).readAsBytesSync()); if (metadata.containsKey('GPS GPSLatitude')) { print("location enabled"); } else { print("location disabled"); } } }
额外检查
- 确认MIUI应用权限中,已为你的应用开启「位置信息」权限。
- 确保设备相机设置里的「保存地理位置」选项处于开启状态。
内容的提问来源于stack exchange,提问作者Thomasssb1
相关产品推荐
相关产品推荐

