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);
}
}
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