================================================================
OpenDance Studio —— Android 辅助 App v0.1.0  使用说明
================================================================

手机端姿态采集器：用摄像头做**端侧**姿态推理，把 33 个骨骼关键点通过
WebSocket 推送给 Windows 客户端，由后者驱动 VRM 角色并实时评分。

隐私：画面不会离开手机。通过网络发送的只有 33 个关键点坐标。

----------------------------------------------------------------
一、安装
----------------------------------------------------------------

方式一（推荐）：直接安装随附的 app-release.apk
  - 在手机上允许「安装未知来源应用」
  - 点击 APK 安装

方式二：用 adb 安装
  adb install -r app-release.apk

要求：Android 10（API 29）或更高版本。

----------------------------------------------------------------
二、快速开始
----------------------------------------------------------------

1. 在 Windows 电脑上启动 OpenDance Studio 客户端
   （Windows 客户端会自动监听 8765 端口）

2. 确保手机与电脑连在**同一个 WiFi**

3. 打开本应用，进入「连接设置」页

4. 填写电脑的 IP 地址，或直接点「扫描局域网」自动发现
   （扫描会探测局域网内开放 8765 端口的主机，约 2~3 秒）

5. 可点「测试连接」确认端口可达

6. 按需调整推流参数（见下）

7. 点「开始推流」，授予相机权限

8. 站到画面中央，屏幕上会出现骨架叠加：
   - 黄色圆点 = 识别良好的关节
   - 红色圆点/红色连线 = 置信度低（光线不足或被遮挡）

9. 在 Windows 客户端上确认已连接，即可开始跟练

----------------------------------------------------------------
三、推流参数
----------------------------------------------------------------

分辨率
  低（480×360）    最省电，适合老机型
  中（640×480）   推荐，识别精度与功耗平衡
  高（1280×720）  最清晰，但推理更慢、更耗电

目标帧率
  默认 30 FPS。低端机若「识别帧率」明显低于目标值，可降到 20 或 15。

镜像画面
  默认开启。前置摄像头的常见用法。
  注意：本应用发送的是**未镜像的原始坐标**，是否镜像由帧头 flags.bit0 声明，
  Windows 客户端据此正确还原左右。因此无论开关如何，动作方向都不会错。

仅上半身模式
  下半身关键点置信度置 0（显示为红点），Windows 端会插值。
  带宽或算力不足时开启可明显降负载。

----------------------------------------------------------------
四、运行页状态说明
----------------------------------------------------------------

连接状态     未连接 / 连接中 / 已连接 / 重连中（第 N 次）/ 已断开
目标         正在连接的 WebSocket 地址
会话         服务端返回的会话 ID
已发送       累计发送帧数
已丢弃       因推理或连接跟不上而丢弃的帧数（>0 说明设备吃力）
发送帧率     实际推流帧率
识别帧率     实际推理帧率
推理耗时     单帧 MediaPipe 推理毫秒数
人体识别     已识别 / 未识别到人体
平均置信度   < 70% 时转黄，提示改善光线或减少遮挡
最近错误     连接或推理的错误原因

网络中断时会**自动重连**（1s → 2s → 4s … 最长 15s 退避），
无需手动操作。

----------------------------------------------------------------
五、常见问题
----------------------------------------------------------------

Q: 扫描不到电脑
A: 1) 确认手机与电脑在同一 WiFi（不是手机热点）
   2) 确认 Windows 客户端已启动并正在监听 8765
   3) 在 Windows 防火墙放行 OpenDance.exe 的 TCP 8765 入站
   4) 部分路由器开启了「AP 隔离」，会阻断设备互访，需在路由器关闭

Q: 显示「已连接」但电脑端没有画面
A: 查看运行页的「已发送」是否在增长。若为 0，说明相机或推理没出帧；
   若「人体识别」一直是「未识别到人体」，请站到画面中央并保证光线充足。

Q: 帧率很低 / 已丢弃帧数持续增长
A: 依次尝试：降低分辨率 → 降低目标帧率 → 开启「仅上半身模式」→ 关闭其他后台应用。

Q: 关键点抖动明显
A: 正常现象，Windows 端有 DTW 带状对齐与平滑处理，不要求逐帧完全一致。
   改善光照可显著提高稳定性。

Q: 应用退到后台会怎样？
A: 返回键或离开运行页会立即停止推流并释放相机，不会在后台占用摄像头。

----------------------------------------------------------------
六、从源码构建
----------------------------------------------------------------

环境要求：
  JDK 17           AGP 8.7.3 要求（JDK 25 未经测试）
  Android SDK      platforms;android-34 与 build-tools;34.0.0
  Gradle 8.9       已随 gradlew 提供

构建：

  export JAVA_HOME=/path/to/jdk17
  export ANDROID_HOME=/path/to/android-sdk

  # 生成发布签名密钥库（首次；文件不会入库，请自行备份）
  bash build/gen-keystore.sh

  # 构建并校验产物
  bash build/build-apk.sh all

  # 一键验证（单元测试 → 构建 → 产物校验）
  bash build/verify.sh

产物：
  app/build/outputs/apk/debug/app-debug.apk
  app/build/outputs/apk/release/app-release.apk

Android Studio 路径：
  打开本目录 → Build → Generate Signed Bundle / APK → APK → 选择 keystore → release

----------------------------------------------------------------
七、测试
----------------------------------------------------------------

  ./gradlew testDebugUnitTest

19 项单元测试（JVM，无需设备），核心是**金标准字节向量测试**：
用 opendance-web 已通过验收的 TypeScript 实现产出的 239 字节向量，
断言本端 Kotlin 实现逐位相同 —— 这是三端契约一致性的硬证据。

测试报告：app/build/reports/tests/testDebugUnitTest/index.html

----------------------------------------------------------------
八、目录结构
----------------------------------------------------------------

  settings.gradle.kts / build.gradle.kts   工程与插件配置
  gradle/wrapper/                          Gradle 8.9 wrapper
  project.yaml                             任务清单与状态
  DSH.md                                   本项目 DSH 执行约束
  tasks/                                   单任务说明书（T-AND-001 ~ 009）
  contracts/                               只读契约快照（来源 opendance-web v0.1.0）
  app/src/main/java/com/opendance/studio/
      MainActivity.kt        三页导航
      model/                 239 字节帧编解码 + 33 点拓扑
      camera/                CameraX 采集
      pose/                  MediaPipe 端侧推理
      net/                   WebSocket 推流 + 主机发现
      data/                  设置
      ui/                    连接页 / 运行页 / 关于页
  app/src/main/assets/pose_landmarker_lite.task   MediaPipe 模型
  build/                   打包与验证脚本

----------------------------------------------------------------
九、许可
----------------------------------------------------------------

本应用代码以 MIT 许可发布。第三方开源项目声明见 THIRD_PARTY.md
（应用内「关于」页同样可查看）。
未使用 SMPL 模型及其衍生拓扑，统一采用 MediaPipe 33 点拓扑。
