2016-12-01 9 views
1

私はモバイルの加速度計を使用してアンドロイドのステップカウンターアプリを構築しようとしています。携帯電話を再起動することなく、ほぼ正確な読みが得られます。これは、各ステップのために、値を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()を1回だけ初期化します。 – Opiatefuchs

答えて

0

問題は、リスナーが登録されていないということです。ちょっとother people reportedと同じです。複数のリスナーが登録されており、共有変数があるため、ステップは2回カウントされます。これを解決するには、リスナーが登録解除されているかどうかを追跡するために共有状態を取得する必要があります。

+0

OnStop()メソッドでリスナーの登録を解除します。再度確認してください –

+0

私はそれを見ましたが、私の答えに掲載されたリンクに説明されているように、登録解除に問題があります。場合によっては、登録を解除することが警告なしで失敗することがあります。 –

+0

私はそれを解決するコードを投稿できますか? –