Android获取图片位置信息
一.需要权限
1)Android 9以及以下
1.需要获取所有文件权限 READ_EXTERNAL_STORAGE
2) Android 12 以及以下
1.需要获取所有文件权限 READ_EXTERNAL_STORAGE
2.需要获取读取media位置权限 ACCESS_MEDIA_LOCATION
3) Android 13
1.需要获取图片读取权限 READ_MEDIA_IMAGES
2.需要获取读取media位置权限 ACCESS_MEDIA_LOCATION
4)Android 14
1.需要获取图片读取权限或者部分文件读取权限
READ_MEDIA_IMAGES 或者READ_MEDIA_VISUAL_USER_SELECTED
2.需要获取读取media位置权限 ACCESS_MEDIA_LOCATION
二.怎么获取
1)ExifInterface获取方式
1.文件ExifInterface(File file)
2.文件名ExifInterface(String filename)
3.文件描述符ExifInterface( FileDescriptor fileDescriptor)
4.输入流ExifInterface(InputStream inputStream)
5.指定类型输入流ExifInterface(InputStream inputStream,int streamType)
2)获取信息
exifInterface.getAttribute(ExifInterface.TAG_GPS_LATITUDE)
TAG_GPS_LATITUDE :指示纬度。
TAG_GPS_LATITUDE_REF :指示纬度是北纬还是南纬。
TAG_GPS_VERSIONID :指示 GPS Info IFD 的版本。
TAG_GPS_LONGITUD_EREF : 指示经度是东经还是西经。
TAG_GPS_TIMESTAMP : 将时间指示为 UTC(协调世界时)。
TAG_GPS_LONGITUDE : 指示经度。
TAG_GPS_DATESTAMP : 记录相对于 UTC(协调世界时)的日期和时间信息
TAG_GPS_IMG_DIRECTION : 指示捕获图像时图像的方向。
TAG_GPS_IMG_DIRECTION_REF : 指示在捕获图像时给出图像方向的参考。
三.坐标转换
/**
* 将 112/1,58/1,390971/10000 格式的经纬度转换成 112.99434397362694格式
* @param string 度分秒
* @return 度
*/
private fun coordinateTransformation(string: String?): Double {
var dimensionality = 0.0
if (null == string) {
return dimensionality
}
//用 ,将数值分成3份
val split = string.split(",".toRegex()).dropLastWhile { it.isEmpty() }
.toTypedArray()
for (i in split.indices) {
val s = split[i].split("/".toRegex()).dropLastWhile { it.isEmpty() }
.toTypedArray()
//用112/1得到度分秒数值
val v = s[0].toDouble() / s[1].toDouble()
//将分秒分别除以60和3600得到度,并将度分秒相加
dimensionality = dimensionality + v / Math.pow(60.0, i.toDouble())
}
return dimensionality
}
四:注意
1).ACCESS_MEDIA_LOCATION 权限没有弹窗只需要请求就可以