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

41 lines
2.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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