Android ExiFinInterface saveAttributes()是否不覆盖以前的数据?

Android ExiFinInterface saveAttributes()是否不覆盖以前的数据?,android,android-camera,jpeg,exif,Android,Android Camera,Jpeg,Exif,我正在尝试在我的自定义相机应用程序中将lat long和其他数据写入jpeg的Exif头。通常,android会自动用光圈、ISO、快门速度等数据填充标题。但是,当我手动添加create aExiFinInterface实例时,使用SetAttributes()设置GPS位置,并调用SaveAttributes();所有其他摄像机数据都消失了 这应该发生吗?如何简单地添加标记而不覆盖其他所有内容 我在其他地方看到了创建两个ExiFinInterface的示例,一个旧的(来自图片)和一个新的,并将

我正在尝试在我的自定义相机应用程序中将lat long和其他数据写入jpeg的Exif头。通常,android会自动用光圈、ISO、快门速度等数据填充标题。但是,当我手动添加create a
ExiFinInterface
实例时,使用
SetAttributes()
设置GPS位置,并调用
SaveAttributes()
;所有其他摄像机数据都消失了

这应该发生吗?如何简单地添加标记而不覆盖其他所有内容

我在其他地方看到了创建两个ExiFinInterface的示例,一个旧的(来自图片)和一个新的,并将每个填充的值与任何其他数据一起从旧复制到新。然而,这是烦人和冗长的。我想找到一个更好的解决办法

这是我的密码:

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(); 
}

从我看到的文档来看,这是不应该发生的。

它清楚地表明它正在复制所有的数据,包括你说的正在消失的东西。你可以发布你正在测试的东西吗。如果你在Android Studio上,你可以尝试文件->使缓存无效/重新启动->使缓存无效并重新启动

或者,我在这里找到了关于丢失数据的类似问题的答案:

正如其他人所指出的,您必须从 原始图像到最终调整大小的图像。梵语机器人 图书馆通常是最好的。根据Android操作系统的版本, ExiFinInterface有时会损坏EXIF数据。此外, ExiFinInterface还处理数量有限的Exif标记,即 只有它“知道”的标签。另一方面,Sanselan将 保留所有EXIF标记和标记注释。 下面是一篇博客文章,展示了如何使用Sanselan复制图像数据: 顺便说一句,在Android上,我也倾向于旋转图像并移除方向EXIF标记。例如,在Android 4.03的Nexus S上 摄影机正在EXIF元数据中设置方向标记,但 webview忽略了该信息并错误地显示了图像。 不幸的是,旋转实际图像数据并移除EXIF 方向标记是让每个程序显示图像的唯一方法 没错


我希望这能有所帮助。

我不知道你为什么会这样。我尝试了你提到的相同方法,我的EXIF数据没有被覆盖。保存属性后,仅修改我的GPS位置。在以下设备上测试,NexusPrime-4.2.1摩托罗拉MotoE-4.4.4
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