我正在开发一个计步器Android应用程序来计算所采取的步数,并使用这些步骤计算所覆盖的距离和燃烧的卡路里。我已经按照教程 Create a Simple Pedometer and Step Counter in Android并完全像它一样。它检测传感器检测到运动时的步数。
但它有一些问题:
我已经从Play商店检查了一些其他应用程序,但他们没有这样做。
我已搜索但无法找到合适的解决方案或教程。任何帮助或建议。谢谢
答案 0 :(得分:4)
这里的问题是你的实现不够复杂:它只检查加速度计数据是否有尖峰并假设尖峰来自一个步骤。它不知道加速度的峰值究竟来自何处:它可能来自你手中跳跃或摇动设备。
如何让它更准确呢?嗯,这是一个非常困难的问题,长期以来一直是科学论文的主题。即使是最复杂的健身追踪器(使用机器学习,信号处理和其他统计方法)也很难确定步骤何时是真实的,何时只是噪音或用户正在玩设备。
幸运的是,Android确实拥有自己的内置step counter和step 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学者获取有关计步算法的最新论文。特别是尝试阅读有关该主题的最新调查。