2016-12-01 25 views
1

我正在嘗試爲使用手機的accerlerometer的android構建一個計步器應用程序。不用重新啓動手機,它可以提供幾乎準確的讀數。對於每個步驟,它會將該值增加1.當移動設備重新啓動時,步驟計數器值將變爲0,因此我使用sharedPreferences保存了以前的讀數值。但是,當我啓動移動設備並開始步行時,對於每個步驟,步長計數器都會遞增2.如何解決?不尋常的計數器讀數

public class Pedometer extends Activity implements SensorEventListener { 
    private TextView textView; 

    private SensorManager mSensorManager; 

    private Sensor mStepCounterSensor; 

    private Sensor mStepDetectorSensor; 

    SharedPreferences sharedPreferences; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_pedometer); 
     textView = (TextView) findViewById(R.id.textview); 

     mSensorManager = (SensorManager) 
       getSystemService(Context.SENSOR_SERVICE); 
     mStepCounterSensor = mSensorManager 
       .getDefaultSensor(Sensor.TYPE_STEP_COUNTER); 
     mStepDetectorSensor = mSensorManager 
       .getDefaultSensor(Sensor.TYPE_STEP_DETECTOR); 
    } 

    @Override 
    public void onSensorChanged(SensorEvent event) { 
     sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 
     SharedPreferences.Editor editor = sharedPreferences.edit(); 

     Sensor sensor = event.sensor; 
     float[] values = event.values; 
     int value = -1; 
     if (values.length > 0) { 
      value = (int) values[0]; 
     } 

     int temp = sharedPreferences.getInt("steps", 0); 

     if (temp > value) { 
      temp = temp + 1; 
      editor.putInt("steps", temp).commit(); 
     } else { 
      editor.putInt("steps", value).commit(); 
     } 

     int count = sharedPreferences.getInt("steps", 0); 

     if (sensor.getType() == Sensor.TYPE_STEP_COUNTER) { 
      textView.setText("Step Counter Detected : " + count); 
     } else if (sensor.getType() == Sensor.TYPE_STEP_DETECTOR) { 
      // For test only. Only allowed value is 1.0 i.e. for step taken 
      textView.setText("Step Detector Detected : " + count); 
     } 
    } 

    @Override 
    public void onAccuracyChanged(Sensor sensor, int accuracy) { 

    } 

    @Override 
    protected void onResume() { 

     super.onResume(); 

     mSensorManager.registerListener(this, mStepCounterSensor, 

       SensorManager.SENSOR_DELAY_FASTEST); 
     mSensorManager.registerListener(this, mStepDetectorSensor, 

       SensorManager.SENSOR_DELAY_FASTEST); 

    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     mSensorManager.unregisterListener(this, mStepCounterSensor); 
     mSensorManager.unregisterListener(this, mStepDetectorSensor); 
    } 
} 
+0

我建議不要在每個'onSensorChangedEvent'上初始化'SharedPreferences'和'Editor'。這是很多工作,並且您不必要地一次又一次地創建這些對象。在onCreate()初始化一次() – Opiatefuchs

回答

0

問題是您的聽衆不是未註冊的,就像一些other people reported一樣。由於您有多個註冊的監聽器和一個共享變量,因此這些步驟將被計數兩次。爲了解決這個問題,你需要獲得一個共享狀態來跟蹤你的聽衆是否被註銷。

+0

我正在取消註冊OnStop()方法的偵聽器。請再次檢查 –

+0

我看到了,但註銷時出現問題,正如我在答覆中發佈的鏈接所解釋的。有時,取消註冊失敗,根本沒有任何警告。 –

+0

你可以把我的代碼解決嗎? –