Count-Step-In-Android
目前 Android 没有系统 Api 提供步数信息, 需要自己统计. 而系统能够提供的接口只有 Sensor 了.
方案对比
方案 1
如果为了兼容低版本, 可以从 Sensor.TYPE_ACCELEROMETER(加速度传感器)
开始. 这个传感器从 Android 1.5 (API 3) 就有了, 通过传感器的 x, y, z. 利用算法计算出相应步数. 特点是兼容性强, 缺点是高功耗, 需要进程常驻.
方案 2:
从 Android 4.4 (API 14) 开始, 系统加入了新的传感器: Sensor.TYPE_STEP_COUNTER
和 Sensor.TYPE_STEP_DETECTOR
.
Sensor.TYPE_STEP_COUNTER
- 当步数变化时, 返回从开机到现在的总步数, 重启清零.
- 这个传感器就是为低功耗设计的, 如果想持续监听步数, 不要反注册
- 用来实现健身类 App 统计步数.
Sensor.TYPE_STEP_DETECTOR
- 走了一步就返回一步, 返回值只有1.
- 方便用来统计某一段时间内的步数.
那么为了统计一天的步数, 当然是使用 方案2 中的 Sensor.TYPE_STEP_COUNTER
.
具体实现
注册传感器.
当手机步数变化时,
SensorEventListener#onSensorChanged()
返回手机从开机到现在的总步数:记录中是否有今日步数?
没有 -> 今日步数为0
有 ->
1. 如果传感器返回的步数 < 记录的今日步数, 那么意味着重启了手机, 则
今日步数 = 今日步数 + 传感器返回的步数.
2. 如果不是大于, 那么正常计步即可.
今日步数 = 今日步数 + (传感器返回的步数 - 记录的今日步数)
补充逻辑
因为每天第一次打开 App 时, 步数一定为0, 所以可以监听时间变化广播 Intent.ACTION_DATE_CHANGED
, 每天打开一次 App 更新本日步数变化, 也可使用 WorkManager, 这样就算 App 没有开启也能更新.
已知问题
- 如果
SensorEventListener
没有收到回调(需要 App 没有被杀并且手机步数有变化), 那么今天的步数就会计入第二天.