最近在寫一個(gè)項(xiàng)目夕凝,需要獲取照片的地理位置信息,一般來說户秤,手機(jī)在拍照的時(shí)候码秉,如果相機(jī)打開了保存地理位置的開關(guān),那么拍攝出來的照片就會(huì)帶有手機(jī)當(dāng)時(shí)所在地的地理位置信息鸡号。
在Android開發(fā)中转砖,需要獲取圖片位置信息的需求~~emmm,還是挺少見的鲸伴。
最開始府蔗,我是通過ContentProvider讀取本地媒體數(shù)據(jù)庫來獲得位置信息的晋控。具體代碼如下:
private void getPhotoLocation() {
ContentResolver contentResolver = getContentResolver();
Cursor cursor = contentResolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, SELECTIMAGES, null, null, null);
int i =0;
if (cursor !=null) {
while (cursor.moveToNext()) {
String path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
File file =new File(path);
if (!file.exists() || !file.canRead())continue;
float latitude = cursor.getFloat(cursor.getColumnIndex(MediaStore.Images.Media.LATITUDE));
float longitude = cursor.getFloat(cursor.getColumnIndex(MediaStore.Images.Media.LONGITUDE));
i++;
Log.d(TAG + i, "latitude:---" + latitude +" " +"longitude:--" + longitude);
}
}
}
然后,發(fā)現(xiàn)在Android10手機(jī)上就獲取不到經(jīng)緯度了姓赤,全部是0赡译。
最后發(fā)現(xiàn)是因?yàn)锳ndroid10以后,本地媒體數(shù)據(jù)庫中的數(shù)據(jù)文件中已經(jīng)沒有l(wèi)atitude和longitude這兩列了模捂。
最后我的解決辦法是捶朵,不通過本地媒體數(shù)據(jù)庫拿經(jīng)緯度數(shù)據(jù),而是直接讀取圖片文件的exif信息狂男。
核心代碼如下:
ExifInterface exif =null;
try {
exif =new ExifInterface(path);
String TAG_GPS_LATITUDE = exif.getAttribute(ExifInterface.TAG_GPS_LATITUDE);
String TAG_GPS_LONGITUDE = exif.getAttribute(ExifInterface.TAG_GPS_LONGITUDE);
}catch (IOException e) {
e.printStackTrace();
}
然后综看,你會(huì)發(fā)現(xiàn)獲取到的TAG_GPS_LATITUDE和TAG_GPS_LONGITUDE的值是類似于這樣的:27/1,36/1,311508/10000。
其實(shí)這是經(jīng)緯度坐標(biāo)的另一種表達(dá)格式岖食,而我們常用的經(jīng)緯度格式就是一個(gè)小數(shù)红碑,例如:27.608653。
這里有篇文章解釋了經(jīng)緯度的格式:https://blog.csdn.net/lhl161123/article/details/73470012
看完文章就知道我們要把上面那串字符轉(zhuǎn)換成正常的小數(shù)形式就要做如下計(jì)算:
27/1 + (36/1)/60 +(311508/10000)/3600 =27+36/60+31.1508/3600 = 27.608653泡垃。
最終的代碼如下:
private void getPhotoLocation() {
private static final String[] SELECTIMAGES = {
MediaStore.Images.Media.DATA,
MediaStore.Images.Media.DISPLAY_NAME,
MediaStore.Images.Media.TITLE,
MediaStore.Images.Media.DATE_ADDED,
MediaStore.Images.Media.DATE_MODIFIED,
MediaStore.Images.Media.LATITUDE,
MediaStore.Images.Media.LONGITUDE,
MediaStore.Images.Media.SIZE
};
ContentResolver contentResolver = getContentResolver();
Cursor cursor = contentResolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, SELECTIMAGES, null, null, null);
int i =0;
if (cursor !=null) {
while (cursor.moveToNext()) {
String path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
File file =new File(path);
if (!file.exists() || !file.canRead())continue;
float latitude = cursor.getFloat(cursor.getColumnIndex(MediaStore.Images.Media.LATITUDE));
float longitude = cursor.getFloat(cursor.getColumnIndex(MediaStore.Images.Media.LONGITUDE));
if (latitude ==0 && longitude ==0) {
ExifInterface exif =null;
try {
exif =new ExifInterface(path);
String TAG_GPS_LATITUDE = exif.getAttribute(ExifInterface.TAG_GPS_LATITUDE);
String TAG_GPS_LONGITUDE = exif.getAttribute(ExifInterface.TAG_GPS_LONGITUDE);
if (!TextUtils.isEmpty(TAG_GPS_LATITUDE) && !TextUtils.isEmpty(TAG_GPS_LONGITUDE)) {
TAG_GPS_LATITUDE = TAG_GPS_LATITUDE.replace("/", ",");
TAG_GPS_LONGITUDE = TAG_GPS_LONGITUDE.replace("/", ",");
String[] lat = TAG_GPS_LATITUDE.split(",");
String[] lng = TAG_GPS_LONGITUDE.split(",");
Float latD =0f;
Float latM =0f;
Float latS =0f;
Float lngD =0f;
Float lngM =0f;
Float lngS =0f;
if (lat.length >=2) {
latD = Float.parseFloat(lat[0]) / Float.parseFloat(lat[1]);
}
if (lat.length >=4) {
latM = Float.parseFloat(lat[2]) / Float.parseFloat(lat[3]);
}
if (lat.length >=6) {
latS = Float.parseFloat(lat[4]) / Float.parseFloat(lat[5]);
}
if (lng.length >=1) {
lngD = Float.parseFloat(lng[0]) / Float.parseFloat(lng[1]);
}
if (lng.length >=2) {
lngM = Float.parseFloat(lng[2]) / Float.parseFloat(lng[3]);
}
if (lng.length >=3) {
lngS = Float.parseFloat(lng[4]) / Float.parseFloat(lng[5]);
}
latitude = latD + latM /60 + latS /3600;
longitude = lngD + lngM /60 + lngS /3600;
}
}catch (IOException e) {
e.printStackTrace();
}
}
i++;
Log.d(TAG + i, "latitude:---" + latitude +" " +"longitude:--" + longitude);
}
}
}
先是將字符串中的/轉(zhuǎn)換成,析珊,然后通過,分割字符串獲得一個(gè)長度為6的數(shù)組,最后通過這六個(gè)數(shù)計(jì)算出經(jīng)緯度值蔑穴。