2016-12-01 23 views
1

我正在尝试为使用手机的accerlerometer的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

我建议不要在每个'onSensorChangedEvent'上初始化'SharedPreferences'和'Editor'。这是很多工作,并且您不必要地一次又一次地创建这些对象。在onCreate()初始化一次() – Opiatefuchs

回答

0

问题是您的听众不是未注册的,就像一些other people reported一样。由于您有多个注册的监听器和一个共享变量,因此这些步骤将被计数两次。为了解决这个问题,你需要获得一个共享状态来跟踪你的听众是否被注销。

+0

我正在取消注册OnStop()方法的侦听器。请再次检查 –

+0

我看到了,但注销时出现问题,正如我在答复中发布的链接所解释的。有时,取消注册失败,根本没有任何警告。 –

+0

你可以把我的代码解决吗? –