Android ExifInterface saveAttributes()不覆盖以前的数据?

我试图在我的自定义相机应用程序中将经纬度和其他数据写入jpeg的Exif头。 通常情况下,android自动使用光圈,ISO,快门速度等数据填充标题。但是,当我手动添加创build一个ExifInterface实例,设置GPS位置SetAttributes() ,并调用SaveAttributes() ; 所有其他相机数据消失。

这是否应该发生? 我怎样才能简单地添加一个标签而不覆盖其他所有东西?

我在其他地方看到了创build两个ExifInterfaces的例子,一个是旧的(来自图片)和一个新的,并将每个从旧到新的填充值与其他数据一起复制。 然而,这是令人讨厌和冗长的。 我想find一个更好的解决scheme。

这是我的代码:

 try{ ExifInterface exif = new ExifInterface(pictureFile.getAbsolutePath()); exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE, mGpsLocation.getLatDms()); exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE, mGpsLocation.getLonDms()); exif.setAttribute(ExifInterface.TAG_GPS_ALTITUDE, mGpsLocation.getAltDms()); exif.saveAttributes(); } catch(IOException e){ e.printStackTrace(); } 

谢谢

Solutions Collecting From Web of "Android ExifInterface saveAttributes()不覆盖以前的数据?"

从我看到的这个文档,这不应该发生。 http://developer.android.com/reference/android/media/ExifInterface.html

 public void saveAttributes () Added in API level 5 Save the tag data into the JPEG file. This is expensive because it involves copying all the JPG data from one file to another and deleting the old file and renaming the other. It's best to use setAttribute(String, String) to set all attributes to write and make a single call rather than multiple calls for each attribute. Throws IOException 

它清楚地表明,它正在复制所有的数据,包括你说的东西正在消失。 你可能会张贴你正在testing的东西吗? 如果你在Android Studio上,你可以尝试File – > Invalidate Caches / Restart – > Invalidate and Restart。

或者,我find了有关丢失数据的类似问题的答案: https : //stackoverflow.com/a/13784057/3585278

正如其他人所指出的,您必须将原始图像中的EXIF数据复制到最终resize的图像。 桑塞兰Android库通常是最好的。 根据Android操作系统版本,ExifInterface有时会损坏EXIF数据。 另外,ExifInterface也处理有限数量的Exif标签 – 即只有它“知道”的标签。 另一方面桑塞兰将保留所有的EXIF标签和标记说明。 这里是一个博客文章,展示了如何使用Sanselan复制图像数据: http ://bricolsoftconsulting.com/copying-exif-metadata-using-sanselan/顺便说一句,在Android上我也倾向于旋转图像,并删除方向EXIF标签。 例如,在Android 4.03的Nexus S上,相机在EXIF元数据中设置了一个方向标签,但是webview忽略了这些信息并且错误地显示了图像。 不幸的是,旋转实际的图像数据和删除EXIF方向标签是让每个程序正确显示图像的唯一方法。

我希望这有帮助。