我正在尝试检测安卓设备的运动并从设备中获取线性加速度值。我正在使用 SensorEvent 的时间戳并将其与上次更新时间进行比较,以确定是否记录传感器值。但它没有任何效果。为什么它不起作用?
@Override
public void onSensorChanged(SensorEvent event) {
if(event.sensor.getType() == Sensor.TYPE_LINEAR_ACCELERATION) {
int value = (int) event.values[0];
if(actualTime - lastUpdate > 5000) {
Log.d(TAG, "" + value);
lastUpdate = actualTime;
}
如果要更改访问传感器的速率,可以在 registerListener 中指定频率,如官方文档中所示。
@Override
protected void onResume() {
super.onResume();
mSensorManager.registerListener(this, mLight,SensorManager.SENSOR_DELAY_NORMAL);
}
在此示例中,默认数据延迟 (SENSOR_DELAY_NORMAL) 是在调用 registerListener() 方法时指定的。数据延迟(或采样率)控制传感器事件通过 onSensorChanged() 回调方法发送到应用程序的时间间隔。默认数据延迟适用于监视典型的屏幕方向变化,并使用 200,000 微秒的延迟。您可以指定其他数据延迟,例如SENSOR_DELAY_GAME(20,000 微秒延迟)、SENSOR_DELAY_UI(60,000 微秒延迟)或SENSOR_DELAY_FASTEST(0 微秒延迟)。从 Android 3.0(API 级别 11)开始,您还可以将延迟指定为绝对值(以微秒为单位)。
绝对有可能放慢速度:)
很难从你的代码中判断你的逻辑是否正确,但一个可能的原因是Sensor
时间戳以纳秒为单位。
请参阅文档:http://developer.android.com/reference/android/hardware/SensorEvent.html#timestamp
因此,假设您正确设置了事件时间戳,为了忽略自上一个事件起不到 5 秒触发的事件,您需要使用值 5000000000
。
@Override
public void onSensorChanged(SensorEvent event) {
if(event.sensor.getType() == Sensor.TYPE_LINEAR_ACCELERATION) {
long actualTime = event.timestamp; //get the event's timestamp
int value = (int) event.values[0];
if(actualTime - lastUpdate > 5000000000) {
Log.d(TAG, "" + value);
lastUpdate = actualTime;
}