如何在Java中一次从多个移动传感器收集数据?

问题描述 投票:0回答:1

我想一次从加速度计,陀螺仪和磁力计收集数据。我目前正在使用基于SensorManagerSensorEvent服务。问题是我只能在给定的时间点从1个传感器获取数据。因此,在时间t1中,我从加速器获取数据,在时间t2中,我从陀螺仪获取数据,在时间t3中,我从磁力计获取数据。

我的代码如下:

public void onSensorChanged(SensorEvent event) {
    if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){
        sText.setText("S: " + event.sensor.getStringType());
    }
    else if (event.sensor.getType() == Sensor.TYPE_GYROSCOPE){
        sText.setText("S: " + event.sensor.getStringType());
    } 
    else if(event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD){
        sText.setText("S: " + event.sensor.getStringType());
    }
}

而不是必须在3个不同的时间使用三个传感器,我希望能够在一个时间间隔内从所有传感器收集数据。这可能吗?

java android-sensors sensormanager
1个回答
0
投票

更换传感器后,您将获得与每个传感器相关的所有事件。对于每个事件,都会调用onSensorChanged

如果要一次访问所有这些事件,则应将它们放在某个缓冲区中。

一种实现方法如下

// At class level
private Map<Integer, Stack<SensorEvent>> eventsBuffer = new HashMap<>();

// to be called from constructor
private void initEventsBuffer() { 
     eventsBuffer.put(Sensor.TYPE_ACCELEROMETER, new Stack<>());
}

public void onSensorChanged(SensorEvent event) {
    if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){
        eventsBuffer.get(Sensor.TYPE_ACCELEROMETER).push(event);
    }
    else if (event.sensor.getType() == Sensor.TYPE_GYROSCOPE){
        eventsBuffer.get(Sensor.TYPE_GYROSCOPE).push(event);
    } 
    else if(event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD){
        eventsBuffer.get(Sensor.TYPE_MAGNETIC_FIELD).push(event);
    }
   processEvents();
}

   private void processEvents() {
   // Start reading from the stack based on event type
       for (Map.Entry<Integer, Stack<SensorEvent>> entry : stack.entrySet()) {
            SensorEvent sensorEvent = entry.getValue().pop();
            Integer eventType = entry.getKey();
            // process now
        }
}
© www.soinside.com 2019 - 2024. All rights reserved.