如何减慢Android传感器事件的速度

时间:2015-04-09 16:31:47

标签: android events sensor

我试图检测Android设备的动作并从设备中获取线性加速度值。我使用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;
            }

2 个答案:

答案 0 :(得分:5)

如果要更改访问传感器的速率,可以在registerListener中指定频率,如官方文档中所述。

@Override
protected void onResume() {
    super.onResume();
    mSensorManager.registerListener(this, mLight,SensorManager.SENSOR_DELAY_NORMAL);
}
  

在此示例中,调用registerListener()方法时指定了默认数据延迟(SENSOR_DELAY_NORMAL)。数据延迟(或采样率)控制传感器事件通过onSensorChanged()回调方法发送到应用程序的时间间隔。默认数据延迟适用于监视典型的屏幕方向更改,并使用200,000微秒的延迟。您可以指定其他数据延迟,例如SENSOR_DELAY_GAME(20,000微秒延迟),SENSOR_DELAY_UI(60,000微秒延迟)或SENSOR_DELAY_FASTEST(0微秒延迟)。从Android 3.0(API Level 11)开始,您还可以将延迟指定为绝对值(以微秒为单位)。

绝对可以放慢速度:)

答案 1 :(得分:0)

很难从你的代码中判断出你的逻辑是否正确,但可能的原因是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;
            }