首页 > 解决方案 > 具有旧值的 SensorEvent

问题描述

我一直在尝试检索以 30 秒为间隔的步数。我使用TYPE_STEP_COUNTER传感器和实现SensorEventListener接口的自定义类。我当前的实现如下所示:

import android.app.job.JobParameters;
import android.app.job.JobService;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;

import java.util.Date;
import java.util.concurrent.TimeUnit;

public class StepSensor extends JobService implements SensorEventListener {

    private static final String TAG = "StepSensor";
    public static final Integer JOB_ID = TAG.hashCode();

    private SensorManager sensorManager;
    private Sensor stepSensor;

    @Override
    public boolean onStartJob(JobParameters params) {
        logStepInformation();
        return false;
    }

    private void logStepInformation() {
        sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        stepSensor = sensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER);

        sensorManager.registerListener(this, stepSensor, SensorManager.SENSOR_DELAY_FASTEST);
    }

    @Override
    public boolean onStopJob(JobParameters params) {
        return false;
    }

    @Override
    public void onSensorChanged(SensorEvent event) {
        StringBuilder stringBuilder = new StringBuilder();
        long milliseconds = TimeUnit.MILLISECONDS.convert(event.timestamp, TimeUnit.NANOSECONDS);

        stringBuilder.append("Registered ");
        stringBuilder.append(event.values[0]);
        stringBuilder.append(" steps at ");
        stringBuilder.append(new Date(milliseconds).toString());

        System.out.println(stringBuilder.toString());

        sensorManager.unregisterListener(this);
        stopSelf();
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
        // Nothing
    }
}

该类被传递给一个JobScheduler实例并在后台运行:

    JobScheduler jobSchedulerstepcounter =
            (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
    jobSchedulerstepcounter.schedule(new JobInfo.Builder(StepSensor.JOB_ID,
            new ComponentName(this, StepSensor.class))
            .setPeriodic(ParamsLogging.STEPCOUNTER_CONTROL_INTERVAL_MILLIS)
            .build());

在哪里

public static final long STEPCOUNTER_CONTROL_INTERVAL_MILLIS = 30*1000L;

但是,似乎存储在 中的值SensorEvent是旧的,并且在该间隔中采取的步骤不会改变:

Registered 134.0 steps at Thu Jan 01 23:04:32 MEZ 1970
Registered 134.0 steps at Thu Jan 01 23:05:02 MEZ 1970
Registered 134.0 steps at Thu Jan 01 23:05:32 MEZ 1970
Registered 134.0 steps at Thu Jan 01 23:06:02 MEZ 1970

文档中:

注意:应用程序不拥有作为参数传递的事件对象,因此无法保留它。该对象可以是内部池的一部分,并且可以被框架重用。

我认为SensorEvent作为参数传递的对象始终与更新的时间戳相同。是否可以获得注册事件时采取的实际步数?

我使用 Android 版本 5.0.2。

标签: androidandroid-5.0-lollipopandroid-sensors

解决方案


推荐阅读