我想一次从加速度计,陀螺仪和磁力计收集数据。我目前正在使用基于SensorManager
的SensorEvent
服务。问题是我只能在给定的时间点从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个不同的时间使用三个传感器,我希望能够在一个时间间隔内从所有传感器收集数据。这可能吗?
更换传感器后,您将获得与每个传感器相关的所有事件。对于每个事件,都会调用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
}
}