隐私与数据边界

Android 图像导出中的 EXIF/XMP 元数据策略

聚焦导出副本的 EXIF/XMP 位置字段策略、格式写入支持、缩略图与写后验证;不重复 EXIF 方向几何,也不声称 Cove 已实现照片元数据清理。

审核状态: 内容已校验;中文稿供用户审核 · 2026-10-08 · Fact IDs: ANDROID-PRIVACY-01, COVE-OCR-01, ANDROID-IMAGE-EXPORT-METADATA-2026-10

直接回答

把图像元数据作为导出副本的契约,而不是让照片变私密的开关。先区分用户原件与应用自有候选副本,明确哪些信息要保留、要移除,以及哪些不在该操作范围内。EXIF 可以包含 GPS 坐标和时间、相机与软件标识、方向、缩略图及其他拍摄信息;XMP 则是另一种可嵌入不同文件位置的元数据模型。“移除 GPS”比“删除所有元数据”范围窄,而且都不会擦掉图像像素中可见的地点线索。 AndroidX ExifInterface 提供 GPSLatitude、GPSLongitude、方向引用、海拔、时间、处理方法和设备相关标签。当前 API 文档说明它可读取 JPEG、PNG、WebP、HEIC、多种 RAW 格式,以及 API 31 以上的 AVIF;但写入范围更窄,仅 JPEG、PNG 和 WebP。可读格式或 MIME 类型检测通过,不代表 saveAttributes 能改写该格式。固定 ExifInterface 依赖版本和实际输出格式,再决定不支持时是拒绝生成导出,还是解码并转成另一个有明确像素/方向验收的格式。 修改操作不能碰用户原件。AndroidX 文档说明 saveAttributes 会将标签变化写回原图文件,而且要把数据复制到另一个文件、删除旧文件并重命名替代文件。导出应先创建位置与写权限可控的应用自有工作副本。按需再写入第二个临时目标,经过验证后才提升为最终输出;解析、写入、替换或验证失败都必须保留源图,不能把残缺文件呈现成已完成的分享对象。 标签删除是选择性操作。ExifInterface.setAttribute(tag, null) 接受 null,AndroidX 实现会从内存中的属性目录移除该 tag,再由保存操作写出。不要用 setGpsInfo(null) 清 GPS:API 明确规定传 null 是 no-op。位置策略要盘点实际需要移除的 GPS 字段,包括经纬度和引用,以及文件中存在的其他位置字段;写出后重新读取目标副本,验证这些字段已消失。若像素仍依赖 Orientation 元数据才能正确显示,就保留方向或先明确规范化像素,再删方向字段。 清 EXIF 不等于清 XMP。AndroidX ExifInterface 文档说明 XMP 可能位于 EXIF 数据内部,也可能写在格式独立位置。对于同时在 EXIF 段和独立段带 XMP 的 JPEG,该 API 说明它会读取 EXIF 内的 XMP,并把修改写回 EXIF 段,而原独立 XMP 段保持不变。该库也有特定版本的 XMP 修复。因此,只检查 GPSLatitude 不足以证明别处没有位置或设备信息。固定依赖版本,检查所用工具能覆盖的容器位置;没有验证过的 packet 位置应标 unknown,除非另一个写入器或重新编码流程已处理并验证。 输出验证要与修改对象分开。完成写入后,用新的解析器重新打开最终文件,检查指定 EXIF tag、支持范围内的 XMP packet、相关缩略图、方向以及实际编码格式。准备带有已知假 GPS、拍摄时间、相机/软件字符串、方向、内嵌缩略图、同时含 EXIF 与独立 XMP 的夹具;同时测试需要移除的字段和需要保留的方向。畸形或不支持的元数据段应返回 unknown 或失败,而不是被断言为清理干净。 对外承诺必须限定到已验证结果。删去 EXIF GPS 不能消除画面中可辨认的坐标、包含地点的文件名、sidecar、缓存预览、日志或已经交给其他应用的副本。CIPA Exif 标准描述 GPS 等字段,XMP 规范则说明元数据 packet 可嵌入不同文件格式,并需要与其他元数据表示协调。这些规范要求定义清单,不代表一次库调用已擦除全部容器。应用应预览准确输出,要求用户明确执行导出,并说明对哪种格式的哪些字段进行了验证;不能称它匿名,也不能声称没有方式恢复位置。 本文是导出方法,不表示 Cove 当前会重写或剥除照片元数据。现有 Cove OCR 事实描述可见文本结果、复制和历史导出,不证明存在处理后照片导出路径。采用策略前,应先确认真实来源、目标格式、ExifInterface 版本、XMP 处理方式和接收方交接。若应用只导出文本,图像元数据剥除就不属于该流程。原图保留、元数据修改、图像重编码与用户分享应当是可分别观察的步骤。

编辑照片准备分享,但元数据策略不明确

Android 应用根据用户选中的照片生成裁剪副本。团队希望从导出副本移除 GPS 坐标,同时保留显示方向。源图可能同时含 EXIF 和独立 XMP packet,目标格式也可能不支持相同的元数据写入操作。

决策

保持源图不变,定义明确的输出标签策略,只修改格式受支持的应用自有副本,并在向用户显示导出前用新解析器验证最终字节。

预期结果

导出物对指定字段与目标格式具有测试证据;未处理的 XMP、缩略图、文件名和画面内容仍不在匿名化结论范围内。

需要收集的证据

只有将以下证据与同一模型文件和测试运行关联起来,结论才可复核:

  • ANDROID-IMAGE-EXPORT-METADATA-2026-10:官方事实卡记录 AndroidX EXIF 写入格式、GPS tag 与 XMP 独立封装边界;不证明 Cove 已有图像清理导出。
  • ANDROID-PRIVACY-01:本地处理仍需区分用户导出、系统服务和接收方的数据边界;不证明某张照片已匿名。
  • COVE-OCR-01:当前 Cove Photo 事实描述结构化可见文本、复制和 OCR 导出,不代表存在编辑图像或剥除 EXIF 的导出路径。

隐私声明需要数据清单和流量证据;“本地模型”标签本身不是证明。

实施流程

  1. 盘点来源、目标和策略. 记录输入容器、源 URI/文件所有权、候选输出格式、接收方及要保留/移除的字段。分别列出 GPS 坐标/引用、时间、设备/软件标签、方向、缩略图和 XMP,不用模糊的“移除元数据”开关代替清单。
  2. 固定写入器契约. 记录准确 AndroidX ExifInterface 版本和目标 MIME。文档中的写入格式比读取格式少;saveAttributes 只能用于受支持格式。isSupportedMimeType 是读取支持检查,不是能写出该格式的证明。
  3. 修改前创建应用自有副本. 绝不对用户源文件调用 saveAttributes。先写应用自有工作副本并保留原图;若失败安全需要,再写一个临时导出文件,验证后才提升为最终输出。
  4. 应用精确标签操作. 按文档使用可空 API 清除指定字段;只有当像素仍需该方向标签时才保留 Orientation。不要把 setGpsInfo(null) 当成删除,它被定义为 no-op。按固定库行为分别处理 EXIF 内部和独立 XMP。
  5. 重新打开并验证最终产物. 写出后使用新的 ExifInterface 或格式专用验证器。检查目标格式、指定 GPS 标签、时间/设备字段、方向、缩略图及策略覆盖的 XMP 位置;未处理片段应标 unknown,而不是 clean。
  6. 给出有限的导出声明. 预览准确输出并要求用户主动导出。只说明在哪种格式中验证移除了哪些字段;文件名、sidecar、可见内容、日志、此前副本和接收方留存不纳入完整匿名化承诺。

让每个阶段的状态都可观察。失败信息应指出阶段、模型、运行时和恢复动作,同时避免记录用户私密内容。

验收标准

  • 成功和注入的解析/写入/验证失败都不会改变用户源文件;元数据仅在应用自有导出副本上修改。
  • 写入库版本和输出格式已固定;文档中的写入支持与读取支持、MIME 检测明确区分。
  • 写后重新打开文件,分别验证指定 GPS/时间/设备字段的移除,以及必需方向/缩略图的保留;在支持范围内单独检查 EXIF 与独立 XMP。
  • 用户文案只描述已验证字段和输出格式,不把选择性 EXIF 移除等同全部元数据删除、匿名化、可见地点消失或接收方副本被清除。

决策对照表

维度选择或证据解读方式
原件上直接修改对用户提供的源图避免这样做saveAttributes 会复制并重命名文件;失败或策略错误可能改变用户唯一原件。
副本上选择性移除 EXIF tag使用字段 allow/deny 清单并写后回读可在支持格式中清除指定 tag,但不会自动清独立 XMP、sidecar、像素内容或接收方副本。
重新编码为新图限定格式并测试像素/方向行为后才采用会改变图像字节且格式处理不同;不代表所有隐藏内容已删除。
写入器不支持时拒绝失败关闭或让用户选择有文档的格式转换比把读取支持或 MIME 可解析误当成 saveAttributes 可重写更安全。

需要避免的失败模式

  • 直接对用户原件调用 saveAttributes,而不是先创建应用自有副本。
  • 把 GPS tag 删除、setGpsInfo(null) 或单次回读当成完整匿名化证明。
  • 混淆 ExifInterface 可读取的文件格式与 saveAttributes 可写入的格式。

还要避免静默回退、版本未固定、缺少取消处理,以及把不同配置的结果混在一起下结论。失败运行也应与成功记录一并保存。

最小复现记录

层级记录内容
设备厂商、型号、芯片、内存档位、操作系统版本
软件应用版本和 Git 提交号
模型系列、变体、版本、格式、文件长度、摘要、量化方式
运行时名称、版本、请求后端及实际后端证据
工作负载样例版本、输入摘要、提示词摘要、输出策略
结果完成、失败、取消、回退及保护隐私的诊断信息

发布检查表

  • ☐ 主要搜索问题已回答,且没有未经支持的数字。
  • ☐ 所有模型文件和运行时版本均已固定。
  • ☐ 代表性任务和失败处理策略均有说明。
  • ☐ 生命周期、取消、清理和回退均已测试。
  • ☐ 用户内容与网络边界均有说明。
  • ☐ 结论只适用于被记录的配置。
  • ☐ 新增测试结果时链接到原始方法或证据。

来源与相关证据

中文部署与排错专题见。奇连 AI 端侧专题。

常见问题

setGpsInfo(null) 会删除 GPS 标签吗?

不会。AndroidX 文档明确说传 null 是 no-op。若策略需要清理,应逐个移除所选支持标签,保存应用自有副本,并重新打开验证结果。

删除 GPS EXIF 是否就能让照片匿名?

不能。独立 XMP、缩略图、其他元数据、文件名、sidecar、可见地标或文字、备份和接收方副本仍可能暴露信息。结论只能限于实际检查过的字段和容器位置。

ExifInterface 能读取 HEIC/AVIF 后再原格式写回吗?

当前 AndroidX API 的读取格式范围比写入格式广;saveAttributes 文档仅支持 JPEG、PNG 和 WebP。应固定库版本与格式,对不支持的输出拒绝或显式转换,不能从解析成功推断可写。

可以直接对导入原图调用 saveAttributes 再分享吗?

不建议。该方法通过临时副本和重命名重写文件。应修改独立的应用自有导出副本,这样失败时原件保留,用户分享前也能先验证策略。