java - 计步器读数异常

标签 java android hardware accelerometer pedometer

我正在尝试使用手机的加速度计为 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);
    }
}

最佳答案

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

关于java - 计步器读数异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40918221/

相关文章:

iphone - iOS 崩溃报告 "Hardware Model"到底是什么意思?

android - 发布 2 个版本应用程序的最佳实践

java - Hibernate 中的自定义监听器定义

java - 如何使用 Java 制作真正大的 boolean 数组?

java - 仅使用行中包含的值获取 JTable 中的行索引?

Android 转换 (API 19) - 如何在转换之前在 TextView 上 setText()?

java - 谷歌云端点生成 Java api HTTP 400 错误

java - 如何获取 PC 主板的温度(以及其他硬件统计数据)?

android - 如何获取专为Android设备设计的前后摄像头的百万像素?

java - Hibernate Query.executeUpdate 是做什么的?