2016-12-01 3 views
1

Ich versuche, eine Schrittzähler App für Android mit dem Accelerometer des Mobiltelefons zu bauen. Ohne das Handy neu zu starten, gibt es fast genaues Lesen. Das heißt, für jede Stufe wird der Wert um 1 erhöht. Wenn das Mobiltelefon neu gestartet wird, wird der Schrittzählerwert auf 0 gesetzt, so dass ich den Wert der vorherigen Lesung unter Verwendung der sharedPreferences gespeichert habe. Aber wenn ich mein Handy starte und anfange zu gehen, erhöht sich der Schrittzähler für jede Stufe um 2. Wie kann ich es lösen?Ungewöhnliche Schrittzähler lesen

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

Ich empfehle, 'SharedPreferences' und' Editor' nicht auf jedem 'onSensorChangedEvent' zu initialisieren. Das ist eine Menge Arbeit und du erschaffst diese Objekte immer wieder unnötig. Einfach einmal onCreate() initialisieren – Opiatefuchs

Antwort

0

Das Problem ist, dass Ihr Listener nicht nicht registriert ist, ebenso wie einige other people reported. Da Sie mehrere Listener registriert und eine gemeinsame Variable haben, werden die Schritte doppelt gezählt. Um dies zu beheben, müssen Sie einen gemeinsamen Status abrufen, um zu verfolgen, ob Ihr Listener nicht registriert ist.

+0

Ich melde die Listener auf OnStop() -Methode ab. Bitte überprüfen Sie noch einmal –

+0

Ich sah das, aber es gibt ein Problem mit der Aufhebung der Registrierung, wie in dem Link, den ich in meiner Antwort geschrieben habe erklärt. Manchmal schlägt die Registrierung ohne vorherige Warnung fehl. –

+0

Kannst du mir den Code posten, um ihn zu lösen? –