特效介绍
最近在用uni-app开发一款旅游app,客户要求能够通过选择相册,读取照片的经纬度和地址。我知道Exif.js可以,但是它并没有针对app进行单独的改造,好在我找到了官方插件库里有,点击下载izExif.js。
先来看下实现的效果:
使用方法
1、下载izExif.js,解压,将里面的js放入自己的项目中
2、引入方法:
import {getImageData, getFloatLocationByExif} from '@/common/izExif.js'
3、选择照片,调用getImageData获得照片的EXIF信息,同时调用getFloatLocationByExif获取经纬度,再调用百度逆地址解析解析接口解析经纬度获取中文地址:
uni.chooseImage({ count: 1, sourceType: ['album'], // 这里不要压缩,否则可能得不到EXIF信息 sizeType: ['original'], success: (res) => { // uni.$app 为我爱模板网封装的公共方法 uni.$app.showLoading('获取照片信息中...') uni.saveFile({ tempFilePath: res.tempFilePaths[0], success: function (file) { // 调用izExif的方法,解析照片的EXIF信息 getImageData(file.savedFilePath).then(res=>{ // 得到拍摄时间 tempAddress.time = res.exif.DateTime // 调用izExif的方法,解析照片的EXIF信息里的经纬度 const lnglat = getFloatLocationByExif(res.exif) if(lnglat === null) { uni.$app.hideLoading() uni.$app.showToast('此照片没有位置信息!') return } tempAddress.latitude = lnglat.lat tempAddress.longitude = lnglat.lon // 调用ajax方法,传递经纬度,得到详细地址,百度逆地址解析解析接口的地址为:https://api.map.baidu.com/geocoder?location=纬度,经度&output=json uni.$app.ajax({ api: uni.$api.getAddrByLatlng(lnglat.lon, lnglat.lat), showLog: true, }).then(res => { if(res.status === 'OK') { tempAddress.address = res.result.formatted_address addressModal.value.open() } uni.$app.hideLoading() }) }).catch(e=>{ console.log(e) }) }, fail: function (error) { console.log('存储失败', error) } }) } })
注意:上面的方法,貌似多此一举的用了uni.saveFile,这是因为如果直接读取相册,安卓10+的targetSdkVersion设置>=29会报错,相见:解决uni.chooseImage勾选相册原图,使用pathToBase64方法转Base64,提示“targetSdkVersion设置>=29后在Android10+系统设备不支持当前路径”的问题。重新保存,他就读取沙盒的照片了,就不会报这个错了。