在图像上设置 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 上返回错误的主要内容,如果未能解决你的问题,请参考以下文章

Android EXIF数据总是0,怎么改?

从图库中选择的 Android 图像方向始终为 0:Exif TAG

如何从 Android 相机图像中去除 EXIF 数据

如何在Android中将exif数据写入图像?

设置 Android 照片 EXIF 方向

android 图像 exif 阅读器 3rd 方 api