2017-10-19 125 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++; 
    } 
}