Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/206.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 异常步进计数器读数_Java_Android_Hardware_Accelerometer_Pedometer - Fatal编程技术网

Java 异常步进计数器读数

Java 异常步进计数器读数,java,android,hardware,accelerometer,pedometer,Java,Android,Hardware,Accelerometer,Pedometer,我正在尝试使用手机的accerlerometer为android构建一个步进计数器应用程序。无需重启手机,它就能提供几乎准确的读数。也就是说,对于每个步骤,它将值增加1。当手机重新启动时,步进计数器的值变为0,因此我使用SharedReferences保存了上一次读取的值。但当我启动手机并开始行走时,每走一步,步数就会增加2。如何解决 public class Pedometer extends Activity implements SensorEventListener { priv

我正在尝试使用手机的accerlerometer为android构建一个步进计数器应用程序。无需重启手机,它就能提供几乎准确的读数。也就是说,对于每个步骤,它将值增加1。当手机重新启动时,步进计数器的值变为0,因此我使用SharedReferences保存了上一次读取的值。但当我启动手机并开始行走时,每走一步,步数就会增加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);
    }
}

问题在于,您的侦听器并没有像某些侦听器一样未注册。由于注册了多个侦听器和一个共享变量,因此步骤将计数两次。要解决这个问题,您需要获得一个共享状态来跟踪您的侦听器是否未注册。

问题在于您的侦听器没有像某些侦听器一样未注册。由于注册了多个侦听器和一个共享变量,因此步骤将计数两次。若要解决此问题,您需要获取共享状态以跟踪您的侦听器是否未注册。

我建议不要在每个
onSensorChangedEvent
上初始化
SharedReferences
Editor
。这需要大量的工作,而且您需要一次又一次地不必要地创建这些对象。只需在onCreate()上初始化一次,我建议不要在sensorchangedevent的每个
上初始化
SharedReferences
Editor
。这需要大量的工作,而且您需要一次又一次地不必要地创建这些对象。只需在onCreate()上初始化一次,我正在注销OnStop()方法上的侦听器。请检查againI看到了这一点,但正如我在回答中发布的链接所解释的,注销存在问题。有时取消注册失败而没有任何警告。我正在取消注册OnStop()方法上的侦听器。请检查againI看到了这一点,但正如我在回答中发布的链接所解释的,注销存在问题。有时,取消注册会在没有任何警告的情况下失败。