uni-app中App端读不到图片经纬度,主要是路径未转换、权限未动态申请或图片无GPS信息;需用plus.io.convertLocalFileSystemURL转换路径,动态申请READ_EXTERNAL_STORAGE及ACCESS_FINE_LOCATION权限,并确认相机已开启地理标记。

uni-app里读不到图片经纬度,大概率是路径或权限问题
直接用 exif.js 解析本地相册图片,在 H5 和小程序上能拿到 GPSLatitude/GPSLongitude,但在 App 端(尤其 Android)经常返回 null。这不是库的问题,而是路径没转对、权限没申请、或图片根本没带 GPS 信息。
Android 原生方式读 EXIF:必须用 plus.android.importClass('android.media.ExifInterface')
App 端不能靠前端 JS 解析二进制流——exif.js 在 Android 上无法访问本地文件系统的真实路径,它只能处理 base64 或网络 URL,而相册选中的图片路径是 file:// 或 cdvfile:// 协议,需先转换。
-
imgPath必须是真实可读的绝对路径,例如:/data/user/0/io.dcloud.HBuilder/apps/HBuilder/www/images/xxx.jpg - 调用
plus.io.convertLocalFileSystemURL(tempFilePath)转换路径,否则ExifInterface初始化失败 - Android 6.0+ 必须动态申请
android.permission.READ_EXTERNAL_STORAGE,仅 manifest 声明不够 - 部分厂商(如华为、小米)还要求
android.permission.ACCESS_FINE_LOCATION,否则即使有 GPS 数据也读不出来
小程序/H5 怎么用 exif.js 安全读取经纬度
在非 App 环境下,exif.js 是可靠选择,但要注意传入的数据格式必须是 ArrayBuffer 或 base64,不能直接传 tempFilePath 字符串。
- 微信小程序:用
wx.getFileSystemManager().readFile({filePath})获取ArrayBuffer,再传给EXIF.getData() - H5:用
FileReader.readAsArrayBuffer(file),不能用readAsDataURL后再 base64 解码——会丢 GPS 数据 - 关键字段名是
GPSLatitude和GPSLongitude,不是latitude/longitude;还要配合GPSLatitudeRef(N/S)和GPSLongitudeRef(E/W)才能算出真实值 - 大疆等设备的方位角不在标准 EXIF 中,得从 XMP 里解析,
exif.js默认不支持,得手动提取 XML 字段
为什么有时明明开了定位、拍了照,还是没 GPS 数据
手机系统或相机 App 可能默认关闭地理标记,用户没主动开启「保存位置信息」,拍出来的图就没有 GPS IFD 段。这不是代码能解决的,得引导用户检查设置。
- Android:设置 → 相机 → 更多设置 → 保存地理位置(不同厂商叫法不同)
- iOS:设置 → 隐私与安全性 → 定位服务 → 相机 → 设为「使用期间」
- 测试时别用截图或网络下载图——这类图几乎 100% 没 EXIF GPS 信息
- 用
ExifInterface.hasAttribute(ExifInterface.TAG_GPS_LATITUDE)先判断是否存在,避免空指针
onLaunch 里统一检查并申请。


















