2016-12-01 8 views
1

Я пытаюсь создать приложение счетчика шагов для 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

Я рекомендую не инициализировать 'SharedPreferences' и' Editor' не на каждом 'onSensorChangedEvent'. Это большая работа, и вы создаете эти объекты без необходимости снова и снова. Просто инициализируйте один раз on onCreate() – Opiatefuchs

ответ

0

Проблема заключается в том, что слушатель не незарегистрированный, так же как некоторые other people reported. Поскольку у вас зарегистрировано несколько слушателей и общая переменная, этапы будут считаться дважды. Чтобы решить эту проблему, вам нужно получить общее состояние для отслеживания, если ваш слушатель не зарегистрирован.

+0

Я не регистрирую слушателя в методе OnStop(). Повторите попытку –

+0

Я видел это, но есть проблема с регистрацией, как объясняется в ссылке, которую я опубликовал в своем ответе. Иногда отказ от регистрации не выполняется без какого-либо предупреждения. –

+0

Можете ли вы отправить мне код для его решения? –

 Смежные вопросы

  • Нет связанных вопросов^_^