0

我试图找出将所有 exif 标签从一个 JEPG 复制到另一个的最佳方法。看起来 ExifInterface ( https://developer.android.com/reference/android/media/ExifInterface ) 是我最好的选择。

然而,

  1. 无法获取一张 JPEG 中包含的所有标签。
  2. ExifInterface 类中所有标签的完整列表是私有的/受保护的。

有比将所有 ~100 个标签名称添加到我的班级更好的选择吗?每次我发现 Android 相机正在添加一个我没有考虑到的新 exif 标签时,我真的不想修改代码。

4

1 回答 1

0

似乎没有这样的方法可以做到这一点,除了可能使用反射来访问ExifInterface类中的私有属性。然而,这是不鼓励的,因为当然,实现可能会在未来的版本中中断。为简洁起见,我在下面写了如何做到这一点。

也就是说,您可以使用Apache Sanslean 之类的东西来做您正在寻找的东西:http: //bricolsoftconsulting.com/copying-exif-metadata-using-sanselan/。但是,我自己没有尝试过,所以我不能说更多

使用反射

查看ExifInterface 源代码,似乎没有获取所有标签的“标准”方式。但是,您可以使用反射来读取mAttributes所有键的映射(虽然这不太安全,但这是最后的手段)。像这样的东西应该可以工作(Java):


Field f = obj.getClass().getDeclaredField("mAttributes");
f.setAccessible(true);
HashMap<String, ExifAttribute>[] attributes = (HashMap<String, ExifAttribute>[]) f.get(obj);

然后,您可以以相同的方式使用反射来访问目标ExifInterface并将所有字段复制到其中。

请注意,我查看了 AndroidX 版本ExifInterface,它是原始类的超集,也是推荐使用的类,但在其他情况下也应如此。

于 2021-08-23T13:07:05.910 回答