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_COUNTERSensor.TYPE_STEP_DETECTOR.

  • Sensor.TYPE_STEP_COUNTER

    1. 当步数变化时, 返回从开机到现在的总步数, 重启清零.
    2. 这个传感器就是为低功耗设计的, 如果想持续监听步数, 不要反注册
    3. 用来实现健身类 App 统计步数.
  • Sensor.TYPE_STEP_DETECTOR

    1. 走了一步就返回一步, 返回值只有1.
    2. 方便用来统计某一段时间内的步数.

那么为了统计一天的步数, 当然是使用 方案2 中的 Sensor.TYPE_STEP_COUNTER.

具体实现

  1. 注册传感器.

  2. 当手机步数变化时, SensorEventListener#onSensorChanged() 返回手机从开机到现在的总步数:

    • 记录中是否有今日步数?

    • 没有 -> 今日步数为0

    • 有 ->

        1. 如果传感器返回的步数 < 记录的今日步数, 那么意味着重启了手机, 则
                今日步数 = 今日步数 + 传感器返回的步数.


        2. 如果不是大于, 那么正常计步即可.


                 今日步数 = 今日步数 + (传感器返回的步数 - 记录的今日步数)

补充逻辑

因为每天第一次打开 App 时, 步数一定为0, 所以可以监听时间变化广播 Intent.ACTION_DATE_CHANGED , 每天打开一次 App 更新本日步数变化, 也可使用 WorkManager, 这样就算 App 没有开启也能更新.

已知问题

  1. 如果 SensorEventListener 没有收到回调(需要 App 没有被杀并且手机步数有变化), 那么今天的步数就会计入第二天.