Я пытаюсь создать приложение счетчика шагов для 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);
}
}
Я рекомендую не инициализировать 'SharedPreferences' и' Editor' не на каждом 'onSensorChangedEvent'. Это большая работа, и вы создаете эти объекты без необходимости снова и снова. Просто инициализируйте один раз on onCreate() – Opiatefuchs