android - 具有旧值的 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。
解决方案
推荐阅读
- javascript - IE11 复制/粘贴无法从剪贴板 Javascript 中检索本地路径
- php - Laravel 5.6 - 在没有中间件的情况下在控制器外部获取经过身份验证的用户
- azure - 远程处理时 Service Fabric 上的重复请求
- python - Python Selenium 选择:“元素
- python - 将脚本 .srt 文件解析为可读文本
- qt - 如何使可见属性在 QML 中立即起作用?
- javascript - 显示块后点击 Javascript 转换
- arrays - 这个数组应该是可变的,但我一直收到一个错误,说它是一个 let 常量......即使它是用 var 声明的?
- python - 改变 xticks matplotlib
- string - 具体的字符串排序[Python 2.7]