Wear OS 手表端久坐提醒 App —— 不依赖三星健康 / 系统「非活动时间」开关。
在手腕上用多信号融合判断「你是否真的动过」,并在需要时震动 + 全屏提醒你站起来。
| 项目 | 说明 |
|---|---|
| 包名 | com.aharon.sedentary |
| 最低系统 | Wear OS / Android API 30+ |
| 语言 | Kotlin |
| 实测设备 | Galaxy Watch 7(SM-L3150) |
| 当前版本 | 1.3.x |
Galaxy Watch 自带的「非活动时间 / 久坐」提醒经常:
- 难找、难开,或提示「无法使用」
- 逻辑不透明,误报 / 漏报多
- 和「站立小时」等目标绑在一起,无法按自己节奏调
起身 是一个独立、可调、可调试的手表端方案:双模式可同时开,有效活动会自动重置计时。
-
连续久坐
在生效时段内,若超过 N 分钟没有「有效活动」,触发一次提醒(同一静坐段只提醒一次,动过再重新计)。 -
站立小时
每个整点小时内累计「活跃分钟」;接近整点结束(默认从第 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 |
高方差 / 节律峰,或配合计步 |
会重置静坐计时的:WALKING、ACTIVE,以及足够的计步、AR 走动类结果。
姿态阈值仍偏启发式,后续计划基于传感器探针实测数据再校准。欢迎 PR 调参或换算法。
| 权限 | 用途 |
|---|---|
ACTIVITY_RECOGNITION |
计步传感器 + 活动识别 |
POST_NOTIFICATIONS |
提醒与前台服务通知 |
FOREGROUND_SERVICE / SPECIAL_USE |
后台持续监测 |
VIBRATE |
震动提醒 |
RECEIVE_BOOT_COMPLETED |
开机恢复 |
WAKE_LOCK |
提醒时点亮 |
首次启动请在系统弹窗中允许活动识别 / 身体活动权限。
- JDK 17
- Android SDK(
compileSdk 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
在手表:设置 → 关于手表 → 软件信息 连点版本号开启开发者选项 → 无线调试 → 配对/连接,记下 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表盘应用列表打开 「起身」 → 开始监测 → 按需在第二页配置:
- 连续久坐阈值(分钟)
- 站立小时目标(分钟)
- 生效时段(起止整点)
- 两模式开关
「更多」页可 预览提醒、查看 调试日志、运行 传感器探针。
# 路径以 App 内「调试日志」页显示为准,常见为:
adb -s $WATCH shell cat /sdcard/Android/data/com.aharon.sedentary/files/debug/qishen.log或:
adb -s $WATCH logcat -s QishenDebug:Dadb -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 实际能拿到的事件。
| 项 | 含义 | 典型默认 |
|---|---|---|
| 监测总开关 | 服务是否工作 | 用户点击开始 |
| 连续久坐 | 模式开关 + 分钟阈值 | 开 / 约 45–50 分 |
| 站立小时 | 模式开关 + 每小时活跃目标 | 开 / 约 1–2 分起 |
| 生效时段 | 仅在此时段内报警 | 如 9–18 |
| 稍后 | snooze 截止时间 | 点「稍后 10 分」 |
具体默认值以 Prefs.kt 为准。
开发早期可用电脑定时推通知(不依赖 App 编译成功):
python3 mac_bridge_reminder.py --help
python3 mac_bridge_reminder.py --test请先 adb connect 好手表。App 安装并稳定后一般不再需要此脚本。
- 坐/站无法仅凭手表完美区分;「安静直立」≠ 一定站着,可能只是手臂角度。
- 打字、转腕 可能被判为轻度活动,导致连续静坐被重置(可后续加「仅计步/走动才重置」选项)。
- Activity Recognition 依赖 GMS,部分表/区域可能失败,会静默降级为计步 + 姿态。
- 连续高采样加速度 更耗电;当前为可调启发式,尚未做系统级低功耗传感器中枢方案。
- 未上架 Play / Galaxy Store,仅 sideload 调试包。
- 基于传感器探针真机数据校准姿态阈值
- 可选:仅「走动/计步」才重置,忽略手腕抖动
- Wear Health Services
PassiveMonitoringClient评估(官方被动健康数据) - 离腕检测:摘表暂停计时
- 更省电的采样策略(静止时降频)
- 英文 UI / 无障碍
- Release 签名与精简包
- Fork → 开分支
- 小步提交,说明「改了什么、为什么」
- 真机验证优先于模拟器
- 开 PR 前尽量附 log 片段或探针结果
Issue 欢迎带:手表型号、Wear OS 版本、复现步骤、相关 QishenDebug 日志。
- 在 Galaxy Watch 7 上对系统非活动提醒「不好用」的真实需求
- AndroidX Wear、Material、Play Services Location
- 社区对 Wear 久坐 / 站立小时产品形态的讨论
本项目仅供个人健康习惯辅助,不是医疗器械,不能替代医嘱。长时间连续使用传感器可能影响续航,请按需启停监测。