在图像上设置 Exif 数据总是在 Android 7 上返回错误
Posted
技术标签:
【中文标题】在图像上设置 Exif 数据总是在 Android 7 上返回错误【英文标题】:Setting Exif data on image always return error on Android 7 【发布时间】:2018-08-27 08:40:25 【问题描述】:我必须在我的图像上设置 exif 数据。在 android 8 中我的代码工作正常,但在 Android 7 中它报告下面的错误,然后没有 exif 数据保存在图像上:
W/ExifInterface:给定标签 (GPSLatitude) 值与预期格式之一不匹配:URATIONAL(猜测:STRING)
这是我的代码:
public void geoTag(String filename, double lng, double lat)
ExifInterface exif;
try
exif = new ExifInterface(filename);
int num1Lat = (int)Math.floor(lat);
int num2Lat = (int)Math.floor((lat - num1Lat) * 60);
double num3Lat = (lat - ((double)num1Lat+((double)num2Lat/60))) * 3600000;
int num1Lon = (int)Math.floor(lng);
int num2Lon = (int)Math.floor((lng - num1Lon) * 60);
double num3Lon = (lng - ((double)num1Lon+((double)num2Lon/60))) * 3600000;
exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE, num1Lat+"/1,"+num2Lat+"/1,"+num3Lat+"/1000");
exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE, num1Lon+"/1,"+num2Lon+"/1,"+num3Lon+"/1000");
...........
【问题讨论】:
num1Lat+"/1,"+num2Lat+"/1,"+num3Lat+"/1000")
抱歉。我们不知道你想设置什么。请给出字符串值。发布可重现的代码。
您好,我想为图库中的图像设置经度和纬度。代码在上面并且可以工作,但仅适用于 Android Oreo (api 26)。请参阅下面的答案...对于字符串值,但重复它很奇怪。
你只是重复了自己。我们都知道。你没有提供我要求的信息。我们不能提供帮助。
【参考方案1】:
我遇到了同样的问题。解决方法是对 num3Lat 和 num3Lon 使用 long 而不是 double。投射到长,一切都很好
【讨论】:
【参考方案2】:@greenapps....感谢您的宝贵时间。基本上我的代码可以从地图中检索位置并保存在 SharedPref 上:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="LatLng">11.812703;42.081890</string>
</map>
之后,我有一个方法可以将该字符串拆分为经度和纬度:
public final void notifyMediaStoreScanner(final File file,Activity mainActivityCatched)
double longituderetrieve;
double latituderetrieve;
try
MediaStore.Images.Media.insertImage(mainActivityCatched.getContentResolver(),
file.getAbsolutePath(), file.getName(), null);
mainActivityCatched.sendBroadcast(new Intent(
Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)));
catch (FileNotFoundException e)
e.printStackTrace();
// SharedPref getPosition = new SharedPref(mainActivityCatched);
SharedPreferences getLatLng = mainActivityCatched.getSharedPreferences("settingModeLatLng",MODE_PRIVATE);
String LatLngShared = getLatLng.getString("LatLng","currentLatLng");
latituderetrieve = Double.parseDouble(LatLngShared.substring(0,LatLngShared.indexOf(";")));
longituderetrieve = Double.parseDouble(LatLngShared.substring(LatLngShared.indexOf(";")+1));
try
geoTag(file.getAbsolutePath(),longituderetrieve,latituderetrieve);
catch (IOException e)
e.printStackTrace();
...最后我将所有值传递给另一个方法来设置 exif 数据中的位置。我原来的代码是:
public void geoTag(String filename, double longi, double lati) throws IOException
ExifInterface exif;
try
exif = new ExifInterface(filename);
int num1Lat = (int)Math.floor(lat);
int num2Lat = (int)Math.floor((lat - num1Lat) * 60);
double num3Lat = (lat - ((double)num1Lat+((double)num2Lat/60))) * 3600000;
int num1Lon = (int)Math.floor(lng);
int num2Lon = (int)Math.floor((lng - num1Lon) * 60);
double num3Lon = (lng - ((double)num1Lon+((double)num2Lon/60))) * 3600000;
exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE, num1Lat+"/1,"+num2Lat+"/1,"+num3Lat+"/1000");
exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE, num1Lon+"/1,"+num2Lon+"/1,"+num3Lon+"/1000");
if (lat > 0)
exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE_REF, "N");
else
exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE_REF, "S");
if (lng > 0)
exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF, "E");
else
exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF, "W");
exif.saveAttributes();
catch (IOException e)
Log.e("PictureActivity", e.getLocalizedMessage());
我的代码的奇怪之处在于 Android api26 工作...... 任何建议都非常感谢! 亚历克斯
【讨论】:
以上是关于在图像上设置 Exif 数据总是在 Android 7 上返回错误的主要内容,如果未能解决你的问题,请参考以下文章