2017-10-19 47 views
4

我正在开发计步器Android应用程序来统计所采取的步骤数,并使用步骤计算覆盖距离和消耗的卡路里。我按照教程 Create a Simple Pedometer and Step Counter in Android并完成它。它检测传感器检测到运动时的步数。计步器(步数计数器)

但也有一些问题吧:

  1. 当我站在我的设备在同一个地方在我的手,只是动了我的手,或给一个混蛋的装置,它检测到的变化,并增加了步数。
  2. 如果我手中的设备移动得非常慢,它不会检测到变化。
  3. 如果我跳,那么它会在柜台上增加几个步骤。

我检查了一些来自Play商店的其他应用程序,他们不这样做。

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

回答

0

这里的问题在于你的实现不够复杂:它只检查加速度计数据是否有尖峰,并假设尖峰来自一个步骤。它不知道加速度的真正来源在哪里:它可能来自你跳跃或摇晃手中的设备。

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

幸运的是,Android确实有它自己的内置版本step counterstep detector,它们比例子中的类更复杂。所以除非你真的想学习信号处理和AI(我强烈推荐,虽然我对步进检测的数据科学知之甚少),但我建议使用内置检测器和计数器。

+0

是的,有一些设备没有传感器。例如,三星J5。我测试了其中一个计步器(在Google上搜索,我认为在Play商店中没有)。当我安装该应用程序时,我收到一条消息,表示它没有传感器,所以应用程序无法运行。另外,我在我的问题中提到的教程的作者在他的文章的最后发表了评论:“大多数Android设备没有内置的步进计数器传感器。”所以这是有道理的。 –

+0

在这种情况下,解决方案是让信号处理更加智能化,即在教程中挖掘解决方案并应用不同的算法。即使如此,如果运动中的尖峰看起来像台阶,那么该算法会将其标记为一个步骤。这里是旧的SO问题可能是有用的:https://stackoverflow.com/questions/6375381/are-there-any-well-known-algorithms-to-count-steps-based-on-the-accelerometer – TukeV

0

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

的细节可以在这里找到: https://source.android.com/devices/sensors/sensor-types#step_detector

如果您仍然希望开发自己从头开始,然后看看这个代码: https://github.com/bagilevi/android-pedometer

您也可以尝试谷歌的学者最新论文上步计数算法。特别是尝试阅读关于该主题的最新调查。

0

通过实施SensorEventListener类中的监听器和重写两种方法onSensorChangedonAccuracyChanged你就可以开始跟踪的步骤。

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

    ... 

} 

现在我们已经初始化了的SensorManager和传感器,并传感器注册为活动中的听众,我们现在需要实现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++; 
    } 
}