android: 修正横屏拍摄方向——文件旋转跟随握持角度,不再只跟显示旋转

用户:"切到横屏拍照片和视频方向又不对了"。

根因:上一轮把文件旋转定成显示旋转(锁定 90° + 手动旋转),而这与手机物理姿态无关。
相机模组固定在手机上,手机转 90° 场景就在传感器画面里转 90°,文件必须跟着转,
否则横屏拍出来就是"竖幅文件里装着横躺的场景"。

修法(普通相机做法):文件旋转 = 显示旋转 + 握持角度(PhotoSaver.captureRotation,
握持角取自 DeviceOrientation.deg)。竖直/倒置 → 竖幅 720x960;两个横屏姿态 → 横幅
960x720,且两者相差 180°。录像在开始录制时采样一次(编码尺寸固定)。预览仍保持锁定
(用户此前明确要求),所以横屏文件不是预览截图,而是预览再转一个握持角。
真机复现时设备恰在 270° 姿态(gx=9.88, gy=-1.02 即 deg=270):
修复前 720x960 竖幅;修复后 960x720 横幅,把修复前文件转 -90° 与新文件逐像素比对
平均亮度差 5.06、转 +90° 为 40.94 —— 方向正确且只差这一转。录像 tkhd 960x720
97帧 0 丢弃;分析页读横幅照片 rot=0:MIN/MAX 各一个且与烧录标记重合。

新增 savedFileRotationFollowsTheGrip / landscapeGripsProduceLandscapeFiles。
105 项测试全绿。文档补记教训:文件方向是世界坐标问题、预览方向是屏幕坐标问题,
两者可以不同;这类"方向正确"必须用同一场景在不同姿态下可复现拍摄来验证。
This commit is contained in:
ZXCLI
2026-09-12 15:02:03 +08:00
parent 4c940fe773
commit f465831d8e
5 changed files with 147 additions and 18 deletions
+41
View File
@@ -489,6 +489,47 @@
"未连接"分支显示,正常出图时用户看不到任何反馈)。
- [x] 单测 66 → **76 项全绿**debug + release(R8) 双构建通过;APK 已更新。
## 用户反馈修复 第二十四轮(2026-09-12,横屏拍摄方向:文件跟随握持角度)
用户反馈:"切到横屏拍照片和视频方向又不对了"。
**根因**:上一轮把照片旋转定为**显示旋转**(锁定 90° + 手动旋转),但这个值与手机的
物理姿态无关。相机模组是**固定在手机上的**,手机转 90°,场景就在传感器画面里转 90°,
所以文件必须跟着转——否则横屏拍出来就是"竖幅文件里装着横躺的场景"。
**修法**(普通相机的做法):
```
文件旋转 = 显示旋转 + 握持角度 (PhotoSaver.captureRotation)
```
握持角度取自 `DeviceOrientation.deg`(0 竖直/90 顺时针/180 倒置/270 逆时针)。
推论:竖直与倒置 → 竖幅文件(720×960);两个横屏姿态 → 横幅文件(960×720),
且两者相差 180°(场景在两种横屏姿态下本来就上下颠倒)。录像在**开始录制时**采样一次
(编码尺寸固定,中途换手不旋转——所有相机都如此)。
注意这**不影响预览**:预览仍是锁定的(用户此前明确要求"热成像画面还是要锁定")。
所以横屏下拍出来的文件不是预览的截图,而是预览**再转一个握持角**——正是这一步让
场景在文件里是正的。
**真机验证(关键证据)**:测试时设备恰好停在 270° 横屏姿态(`dumpsys sensorservice`
读数 gx=9.88, gy=-1.02 → deg=270),于是直接复现了用户的问题:
- 修复前:720×960 **竖幅**,内容相对竖直姿态拍的照片转了 90°
- 修复后:960×720 **横幅**;把修复前的文件转 **-90°** 与新文件逐像素比对,
平均亮度差 **5.06**,而转 +90° 的差是 **40.94** → 方向正确、只差这一转
- 录像:`tkhd 960 x 720`、avc1、97 帧 0 丢弃
- 分析页读该横幅照片(rot=0):MIN/MAX 各一个、与烧录标记重合,
面板 41.4 / 21.7 / 27.0 与照片一致
新增测试 `savedFileRotationFollowsTheGrip`(四种握持角度 + 手动旋转叠加)与
`landscapeGripsProduceLandscapeFiles`(形状规则 + 两个横屏姿态相差 180°)。
105 项测试全绿。
**教训**:文件方向是"世界坐标"问题,预览方向是"屏幕坐标"问题——两者可以不同,
混为一谈就会在某个握持姿态下出错。固件级/相机类功能的"方向正确"必须用
**同一场景在不同姿态下的可复现拍摄**来验证,不能只靠推导。
## 用户反馈修复 第二十三轮(2026-09-12,照片竖屏 / 标注风格重做 / 录像清晰度)
用户第五轮反馈(三点):竖屏拍照出来的照片不是竖屏;录像里的温度标点糊;