uni.getimageinfo无法获取gps信息,因其在ios、小程序等平台默认过滤exif中的gps字段;需用原生exifinterface(android)、exif-js(h5/小程序)或uts插件(鸿蒙)解析原始数据,并确保用户已授权位置权限。

不能直接靠 uni.getImageInfo 拿到经纬度——它在绝大多数平台(尤其是 iOS 和微信小程序)返回的 exif 字段为空或不包含 GPS 信息;必须用原生能力或 EXIF 解析库主动读取原始字节数据。
为什么 uni.getImageInfo 拿不到 GPS 信息
该 API 在 H5 端依赖浏览器限制,iOS/Android 原生层默认不透出 GPS 元数据;小程序端受平台安全策略约束,exif 对象只保留极少数基础字段(如 Orientation),GPSLatitude、GPSLongitude 等被直接过滤。实测中即使图片本身含完整 EXIF,uni.getImageInfo 的 success 回调里也几乎拿不到位置字段。
Android 端用 native.js 直接调 ExifInterface
仅适用于 App 打包(非 H5 或小程序),且必须确保图片路径是本地可读的绝对路径(tempFilePath 需先转为沙箱路径):
- 用
plus.io.convertLocalFileSystemURL(tempFilePath)转换路径 - 导入 Android 类:
const ExifInterface = plus.android.importClass('android.media.ExifInterface') - 关键字段必须用标准 TAG 常量:
ExifInterface.TAG_GPS_LATITUDE、ExifInterface.TAG_GPS_LONGITUDE、ExifInterface.TAG_GPS_LATITUDE_REF、ExifInterface.TAG_GPS_LONGITUDE_REF - 注意:返回值是字符串格式(如
"22/1,34/1,5678/100"),需手动解析为十进制度数,并结合Ref字段判断正负("S"或"W"为负)
H5 + 小程序端用 exif-js 解析 blob/文件对象
适用于所有平台,但前提是能拿到图片的 Blob 或 File 对象(不能是临时路径字符串):
- H5 端:用
new Image()加载tempFilePath(它是 blob URL),等img.onload后传给EXIF.getData(img, ...) - 小程序端:需先用
uni.downloadFile把tempFilePath下载为本地临时文件,再用uni.getFileSystemManager().readFile读成ArrayBuffer,最后喂给EXIF.readFromBinaryFile - GPS 字段名固定为
GPSLatitude、GPSLongitude,但值是数组形式的有理数(如[22, 34, 5678/100]),需用EXIF.GPSHelper或手写函数转为小数 - 务必检查
EXIF.getTag(img, 'GPSInfo') !== null,否则直接读 GPS 字段会返回undefined
鸿蒙(HarmonyOS)端必须用 UTS 插件调 ImageKit
鸿蒙不支持 exif-js 或 Android 原生类,也不能用 uni.getImageInfo 获取 GPS,唯一可靠路径是 UTS 插件:
- UTS 中调用
@kit.ImageKit的createImageSource(filePath) - 再用
imageSource.getImageProperty('Exif', {})获取完整 EXIF 对象 - GPS 数据结构为嵌套对象:
exifData.GPSInfo?.Latitude、exifData.GPSInfo?.Longitude,单位已是十进制度数,无需手动解析 - 注意:图片必须已存入应用沙箱路径(不能是图库 URI),需先用
photoAccessHelper复制到files/下
最易被忽略的一点:所有平台下,用户必须在拍照/选图前开启「位置权限」,且系统设置里要允许该 App 访问照片的地理位置信息——否则即使代码全对,EXIF 里 GPS 字段也是空的。安卓 10+、iOS、鸿蒙都默认不写入位置,这个开关不在前端代码里,而在用户手机设置中。











