Android设置图片EXIF自定义属性失败问题求助
Android EXIF属性设置问题解决方案
一、标准标签TAG_FOCAL_PLANE_X_RESOLUTION失效原因及修复
TAG_FOCAL_PLANE_X_RESOLUTION属于EXIF中的有理数值类型(RATIONAL),不能直接传入纯数字字符串,必须使用分子/分母的格式表示。你之前传入的"330"不符合格式要求,导致设置失效。
正确代码示例:
ExifInterface exifInterface = new ExifInterface(path); // 用分数格式表示有理数值,330/1等价于330 exifInterface.setAttribute(ExifInterface.TAG_FOCAL_PLANE_X_RESOLUTION, "330/1"); exifInterface.saveAttributes();
二、自定义标签(Yaw/Pitch/Roll)写入失败的解决方法
Android原生ExifInterface仅支持标准定义的EXIF标签,未在系统文档中定义的自定义标签会静默写入失败。有两种可行方案:
方案1:利用标准标签存储自定义数据
使用EXIF标准中的TAG_USER_COMMENT标签,将Yaw、Pitch、Roll序列化为JSON或字符串存储:
ExifInterface exifInterface = new ExifInterface(path); // 将姿态数据序列化为JSON字符串 String poseJson = "{\"Yaw\":0.3, \"Pitch\":0.0, \"Roll\":0.1}"; exifInterface.setAttribute(ExifInterface.TAG_USER_COMMENT, poseJson); exifInterface.saveAttributes();
读取时只需解析该字符串即可还原数据。
方案2:使用第三方库直接操作自定义标签
借助androidx.exifinterface:exifinterface扩展库或MetadataExtractor等工具,直接指定自定义标签的ID、IFD(图像文件目录)和数据类型:
import androidx.exifinterface.media.ExifInterface; ExifInterface exif = new ExifInterface(path); // 指定EXIF IFD目录,选择未被标准占用的标签ID(如0x920A) int customYawTagId = 0x920A; // 设置自定义标签值,这里以字符串类型为例 exif.setAttribute(ExifInterface.EXIF_TAG_IFD, customYawTagId, "0.3"); exif.saveAttributes();
注意:自定义标签ID需避免与标准EXIF标签ID冲突,读取时需用相同的ID和IFD获取值。
额外注意事项
- 确保文件拥有写入权限:Android 10及以上版本,若操作公共目录文件,需通过
MediaStore或申请MANAGE_EXTERNAL_STORAGE权限;操作应用私有目录文件则无需额外权限。 - 调用
saveAttributes()后,建议重新读取EXIF信息验证,避免因缓存导致的读取偏差。
内容的提问来源于stack exchange,提问作者Tom3652
相关产品推荐
相关产品推荐

