Files
App.K12.Student.Miniapp_Flu…/debug-avatar-orientation.md
2026-09-04 15:22:20 +08:00

2.6 KiB
Raw Permalink Blame History

Debug Session: avatar-orientation

  • Status: [OPEN]
  • Issue: 手机拍照后上传头像,期望经过 EXIF 方向修正后始终正向显示;实际上传成功后仍保持拍照时的方向,未自动转正。
  • Debug Server: http://127.0.0.1:7777/event (Android 通过 adb reverse tcp:7777 tcp:7777 回传)
  • Log File: .dbg/trae-debug-log-avatar-orientation.ndjson

Reproduction Steps

  1. Android 真机打开 App。
  2. 进入“我的”页,点击头像。
  3. 选择“拍照”,使用横屏/竖屏拍摄一张照片并确认。
  4. 等待上传成功,观察最终头像是否已经转正。

Hypotheses & Verification

ID Hypothesis Likelihood Effort Evidence
A 拍照返回的字节已被系统或插件提前烘焙,EXIF orientation 不存在或恒为 1,所以 bakeOrientation 无事可做 High Low Confirmed
B originBytes 读取到的不是原始照片数据,丢失了 EXIF;而 originFile/file 路径上的文件与之不同 High Medium Confirmed
C 图片确实已旋正上传,但显示层仍在展示未处理的本地预览或缓存图 Medium Low Rejected
D image 包已读到 EXIF,但在当前手机样本上 bakeOrientation 前后宽高/方向无变化,问题出在更早的相机输出阶段 Medium Medium Pending
E OSS / CDN 返回的是旧缓存图,导致看到的仍是原方向 Low Medium Pending

Log Evidence

  • my_page.dart:_onAvatarTap:pick:两次拍照都返回 hasEntity=true、source=entity-originBytes
  • my_page.dart:_onAvatarTap:upload:两次都成功上传,分别得到新的 JPG URL,说明上传链路正常
  • my_page.dart:_onAvatarTap:preview-clear:上传成功后 _pickedAvatar 已清空,页面不再优先显示本地临时预览
  • my_page.dart:_onAvatarTap:processor:
    • hasExifOrientation=false
    • exifOrientationBefore=null
    • exifOrientationAfter=null
    • decodedWidth=2160, decodedHeight=3840
    • orientedWidth=2160, orientedHeight=3840
    • resized=true 说明进入处理链的字节已经没有 EXIF orientation,bakeOrientation 前后没有任何方向变化空间

Verification Conclusion

  • 已确认上传成功且显示层已切回服务器图,C 被排除
  • 根因已锁定:
    • A:相机输出最终交给业务层的字节本身已无 EXIF orientation
    • B:wechat_camera_picker 默认保存为 AssetEntity 后,再走 entity-originBytes 会丢失最初拍照文件里的方向信息
    • D:bakeOrientation 前后没有任何变化,是因为输入里已经没有可烘焙的 orientation