Skip to content

Repository files navigation

起身(Qishen)

Wear OS 手表端久坐提醒 App —— 不依赖三星健康 / 系统「非活动时间」开关。
在手腕上用多信号融合判断「你是否真的动过」,并在需要时震动 + 全屏提醒你站起来。

项目 说明
包名 com.aharon.sedentary
最低系统 Wear OS / Android API 30+
语言 Kotlin
实测设备 Galaxy Watch 7(SM-L3150)
当前版本 1.3.x

为什么要做这个

Galaxy Watch 自带的「非活动时间 / 久坐」提醒经常:

  • 难找、难开,或提示「无法使用」
  • 逻辑不透明,误报 / 漏报多
  • 和「站立小时」等目标绑在一起,无法按自己节奏调

起身 是一个独立、可调、可调试的手表端方案:双模式可同时开,有效活动会自动重置计时。


功能一览

双模式监测(可同时开启)

  1. 连续久坐
    在生效时段内,若超过 N 分钟没有「有效活动」,触发一次提醒(同一静坐段只提醒一次,动过再重新计)。

  2. 站立小时
    每个整点小时内累计「活跃分钟」;接近整点结束(默认从第 50 分钟起)若未达目标,提醒补走动。

多信号融合(不是纯定时器)

信号 来源 作用
计步 TYPE_STEP_COUNTER / STEP_DETECTOR 累计步数达到阈值 → 视为有效活动
姿态 加速度窗口分类 PostureEstimator 走动 / 轻度活动 → 重置;安静休息 / 直立用于展示
活动类型 Google Play Services Activity Recognition WALKING / ON_FOOT / RUNNING 等(有 GMS 时)

有效活动会:

  • 重置「连续静坐」计时
  • 计入「本小时活跃」
  • 更新前台通知文案

提醒体验

  • 前台服务常驻监测 + 低打扰状态栏文案(中文姿态,如「安静休息」)
  • 到期:震动 + 通知 + 全屏弹窗
  • 我动了:手动确认并重置
  • 稍后 10 分:延后提醒
  • 开机 / 应用更新后可按设置恢复(BootReceiver

界面

  • 温暖浅色健康风(非深色表盘默认风)
  • 三页横向滑动:首页(Hero + 状态)· 规则设置 · 更多(预览 / 调试)
  • 首次启动滑动提示
  • 自定义活力环图标

调试工具

  • 调试日志:内存环缓冲 + 文件,便于 adb 拉取调参
  • 传感器探针SensorProbeActivity):枚举 SensorManager 可见传感器并采样数秒,用于研究本机实际能读到什么数据

界面结构

首页          设置              更多
┌────────┐  ┌────────────┐   ┌──────────┐
│ Hero   │  │ 连续久坐   │   │ 预览提醒 │
│ 开始/停│  │ 站立小时   │   │ 调试日志 │
│ 静坐时长│  │ 阈值/目标  │   │ 传感器探针│
│ 本时进度│  │ 生效时段   │   │          │
└────────┘  └────────────┘   └──────────┘
        ←  左右滑动  →

架构概览

MainActivity (ViewPager2)
    ├── 首页:启停服务、展示状态
    ├── 设置:Prefs 读写
    └── 更多:Alert 预览 / Debug / SensorProbe

SedentaryMonitorService (前台服务)
    ├── 计步 SensorEventListener
    ├── PostureEstimator(加速度姿态)
    ├── ActivityTypeTracker(GMS AR,可选)
    └── 每 15s evaluate()
            ├── 连续久坐规则
            └── 站立小时规则 → AlertActivity / 通知 / 震动

Prefs · TimeWindows · NotificationHelper · DebugLogger

关键源码

文件 职责
SedentaryMonitorService.kt 融合逻辑、双模式、前台通知
PostureEstimator.kt 加速度窗口 → 姿态标签
ActivityTypeTracker.kt Play Services 活动识别
SensorProbe.kt / SensorProbeActivity.kt 传感器枚举与采样
Prefs.kt 本地设置与状态
TimeWindows.kt 生效时段 / 整点小时
AlertActivity.kt 全屏提醒
mac_bridge_reminder.py (可选)电脑 ADB 桥接提醒,开发期备用

姿态标签说明

手腕传感器无法可靠区分「坐 vs 站」,当前用加速度做轻量分类:

标签(UI) 内部枚举 大致含义
识别中 UNKNOWN 样本不足
安静休息 STILL_REST 低运动,常见办公/静坐手腕
安静直立 STILL_UPRIGHT 低运动,手臂偏竖直
轻度活动 ACTIVE 运动能量升高(打字、手势等也可能触发)
正在走动 WALKING 高方差 / 节律峰,或配合计步

会重置静坐计时的WALKINGACTIVE,以及足够的计步、AR 走动类结果。

姿态阈值仍偏启发式,后续计划基于传感器探针实测数据再校准。欢迎 PR 调参或换算法。


权限

权限 用途
ACTIVITY_RECOGNITION 计步传感器 + 活动识别
POST_NOTIFICATIONS 提醒与前台服务通知
FOREGROUND_SERVICE / SPECIAL_USE 后台持续监测
VIBRATE 震动提醒
RECEIVE_BOOT_COMPLETED 开机恢复
WAKE_LOCK 提醒时点亮

首次启动请在系统弹窗中允许活动识别 / 身体活动权限。


环境要求

  • JDK 17
  • Android SDKcompileSdk 34,platform-tools 含 adb
  • 手表开启开发者选项 → 无线调试(或 USB/充电座调试)
  • 电脑与手表同一局域网(无线 ADB 时)

可选:Android Studio Hedgehog+,用 Wear 模拟器跑 UI(传感器行为以真机为准)。


构建

git clone https://github.com/initH271/qishen-watch.git
cd qishen-watch

# 本地 SDK 路径(勿提交)
echo "sdk.dir=$HOME/Library/Android/sdk" > local.properties   # macOS 示例

export JAVA_HOME=$(/usr/libexec/java_home -v 17 2>/dev/null || echo /opt/homebrew/opt/openjdk@17)
export ANDROID_HOME=${ANDROID_HOME:-$HOME/Library/Android/sdk}

./gradlew :app:assembleDebug

产物:

app/build/outputs/apk/debug/app-debug.apk

安装到 Galaxy Watch

1. 连接手表

在手表:设置 → 关于手表 → 软件信息 连点版本号开启开发者选项 → 无线调试 → 配对/连接,记下 IP:端口

adb connect 192.168.x.x:xxxxx
adb devices -l
# 应看到类似 model:SM_L3150 的设备

多设备时指定序列号:

export WATCH=192.168.x.x:xxxxx
adb -s $WATCH install -r app/build/outputs/apk/debug/app-debug.apk

adb install 因权限/会话问题失败,可:

adb -s $WATCH push app/build/outputs/apk/debug/app-debug.apk /data/local/tmp/qishen.apk
adb -s $WATCH shell pm install -r /data/local/tmp/qishen.apk

2. 启动

表盘应用列表打开 「起身」开始监测 → 按需在第二页配置:

  • 连续久坐阈值(分钟)
  • 站立小时目标(分钟)
  • 生效时段(起止整点)
  • 两模式开关

「更多」页可 预览提醒、查看 调试日志、运行 传感器探针

3. 拉取调试日志

# 路径以 App 内「调试日志」页显示为准,常见为:
adb -s $WATCH shell cat /sdcard/Android/data/com.aharon.sedentary/files/debug/qishen.log

或:

adb -s $WATCH logcat -s QishenDebug:D

4. 传感器探针(真机调研)

adb -s $WATCH shell am start -n com.aharon.sedentary/.SensorProbeActivity
# 或自动枚举 + 采样 8 秒:
adb -s $WATCH shell am start -n com.aharon.sedentary/.SensorProbeActivity --ez auto true

在 Galaxy Watch 7 上,dumpsys sensorservice 可见加速度、陀螺仪、重力/线加速度、计步、离腕、心率等;三星私有类型多需 SSENSOR 等权限,普通第三方 App 未必能注册成功。探针用于确认本 App 实际能拿到的事件


配置项(Prefs)

含义 典型默认
监测总开关 服务是否工作 用户点击开始
连续久坐 模式开关 + 分钟阈值 开 / 约 45–50 分
站立小时 模式开关 + 每小时活跃目标 开 / 约 1–2 分起
生效时段 仅在此时段内报警 如 9–18
稍后 snooze 截止时间 点「稍后 10 分」

具体默认值以 Prefs.kt 为准。


可选:Mac ADB 桥接脚本

开发早期可用电脑定时推通知(不依赖 App 编译成功):

python3 mac_bridge_reminder.py --help
python3 mac_bridge_reminder.py --test

请先 adb connect 好手表。App 安装并稳定后一般不再需要此脚本。


已知限制

  1. 坐/站无法仅凭手表完美区分;「安静直立」≠ 一定站着,可能只是手臂角度。
  2. 打字、转腕 可能被判为轻度活动,导致连续静坐被重置(可后续加「仅计步/走动才重置」选项)。
  3. Activity Recognition 依赖 GMS,部分表/区域可能失败,会静默降级为计步 + 姿态。
  4. 连续高采样加速度 更耗电;当前为可调启发式,尚未做系统级低功耗传感器中枢方案。
  5. 未上架 Play / Galaxy Store,仅 sideload 调试包。

路线图(欢迎一起做)

  • 基于传感器探针真机数据校准姿态阈值
  • 可选:仅「走动/计步」才重置,忽略手腕抖动
  • Wear Health Services PassiveMonitoringClient 评估(官方被动健康数据)
  • 离腕检测:摘表暂停计时
  • 更省电的采样策略(静止时降频)
  • 英文 UI / 无障碍
  • Release 签名与精简包

贡献

  1. Fork → 开分支
  2. 小步提交,说明「改了什么、为什么」
  3. 真机验证优先于模拟器
  4. 开 PR 前尽量附 log 片段或探针结果

Issue 欢迎带:手表型号、Wear OS 版本、复现步骤、相关 QishenDebug 日志。


致谢

  • 在 Galaxy Watch 7 上对系统非活动提醒「不好用」的真实需求
  • AndroidX Wear、Material、Play Services Location
  • 社区对 Wear 久坐 / 站立小时产品形态的讨论

License

MIT


免责声明

本项目仅供个人健康习惯辅助,不是医疗器械,不能替代医嘱。长时间连续使用传感器可能影响续航,请按需启停监测。

About

起身:Wear OS 手表端多信号融合久坐/站立小时提醒(Galaxy Watch 等)

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages