计步器(步数计数器)

时间:2017-10-19 06:32:52

标签: android sensormanager pedometer

我正在开发一个计步器Android应用程序来计算所采取的步数,并使用这些步骤计算所覆盖的距离和燃烧的卡路里。我已经按照教程 Create a Simple Pedometer and Step Counter in Android并完全像它一样。它检测传感器检测到运动时的步数。

但它有一些问题:

  1. 当我站在同一个地方,手里拿着我的设备,只是移动我的手或给设备一个挺举,它会检测到变化并增加步数。
  2. 如果我手持设备的速度非常缓慢,则无法检测到更改。
  3. 如果我跳,那么它会在柜台中添加几个步骤。
  4. 我已经从Play商店检查了一些其他应用程序,但他们没有这样做。

    我已搜索但无法找到合适的解决方案或教程。任何帮助或建议。谢谢

3 个答案:

答案 0 :(得分:4)

这里的问题是你的实现不够复杂:它只检查加速度计数据是否有尖峰并假设尖峰来自一个步骤。它不知道加速度的峰值究竟来自何处:它可能来自你手中跳跃或摇动设备。

如何让它更准确呢?嗯,这是一个非常困难的问题,长期以来一直是科学论文的主题。即使是最复杂的健身追踪器(使用机器学习,信号处理和其他统计方法)也很难确定步骤何时是真实的,何时只是噪音或用户正在玩设备。

幸运的是,Android确实拥有自己的内置step counterstep detector,它们比你的例子中的类更复杂。

因此,除非你真的想学习信号处理和人工智能(我强烈推荐,虽然我不太了解步检测的数据科学),但我建议使用内置检测器和计数器。

答案 1 :(得分:4)

通过在类中实现 SensorEventListener 侦听器并覆盖两个方法 onSensorChanged onAccuracyChanged ,您可以开始跟踪步骤。

    public class StepActivity extends Activity implements SensorEventListener{
    SensorManager sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    Sensor sSensor= sensorManager .getDefaultSensor(Sensor.TYPE_STEP_DETECTOR);

    ...

}

现在我们初始化了SensorManager和Sensor并将Sensor注册为活动中的监听器,我们现在需要实现 onSensorChanged 功能,该功能将由 SensorEvent触发每当我们注册的传感器发生变化时,在我们的情况下 TYPE_STEP_DETECTOR

private long steps = 0;

@Override
public void onSensorChanged(SensorEvent event) {
    Sensor sensor = event.sensor;
    float[] values = event.values;
    int value = -1;

    if (values.length > 0) {
        value = (int) values[0];
    }


    if (sensor.getType() == Sensor.TYPE_STEP_DETECTOR) {
        steps++;
    }
}

答案 2 :(得分:2)

这是一种非常天真的实现步数的方法。您应该使用Android的内置步进计数器,因为它还使用其他传感器(如陀螺仪)可以改善步进检测。如果你打算在它上面构建东西,你应该特别使用这个内置版本。您需要一个可靠的底层。您也可以尝试使用线性加速度传感器,该传感器通过从加速度计中移除重力分量来计算。重力使加速度计非常敏感,这就是为什么当你站立时你会看到步数增加的原因。

详情可在此处找到: https://source.android.com/devices/sensors/sensor-types#step_detector

如果您仍想从头开发自己的,请查看以下代码: https://github.com/bagilevi/android-pedometer

您还可以尝试Google学者获取有关计步算法的最新论文。特别是尝试阅读有关该主题的最新调查。