# 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