Android Sensor同时记录值

时间:2011-07-13 16:11:25

标签: android events android-sensors

我正在构建一个应用程序,它必须将各种传感器值同时记录到.csv文件中(如果传感器可用)。任何人都可以建议将值插入csv文件(表格形式)的方法。是否可能在单个传感器更改事件中记录所有.csv值。

Anva

1 个答案:

答案 0 :(得分:2)

您一次只能从1个传感器接收数据,传感器可能会以不同的时间间隔报告数据。

有几种方法可以解决这个问题。

最简单的方法是缓存每个传感器的值,然后每当获得任何传感器的新数据时,都会更新该传感器的缓存值,然后写入包含所有缓存传感器值的新CSV行。这个新的CSV系列只会与之前更新过的数据传感器的前一行不同。

(Pseudo-code)
onSensorChanged(SensorEvent event) {
    //Note: in practice, you need to copy the values out of the event.values array
    //using, for example, System.arraycopy
    cached_values[event.sensor.getType()] = event.values; 
    writeCsvLine(cached_values);
}

或者,不是每次获得一条数据时都写一行CSV,而是可以缓存传感器值,直到你得到一个"重复的" - 即您已经拥有未写入数据的传感器的数据。然后你会为缓存的值写出一行CSV行,重置你的" is_written"每个传感器的标志,并更新您刚刚获得的传感器的缓存值。这样,您在CSV文件中没有多少重复值,但仍然保证不会错过任何报告的传感器值。

(Pseudo-code)
onSensorChanged(SensorEvent event) {
    if (!cached_value_written[event.sensor.getType()]) {
       writeCsvLine(cached_values);
       cached_values_written.reset(); //reset all flags to true
    }
    cached_values[event.sensor.getType()] = event.values; 
    cached_value_written[event.sensor.getType()] = false;
}

另一种方法是在获得传感器值时对其进行缓存,然后在另一个线程中,您将获取“当前”#34;每个值,例如1秒,然后写出来。在这种方法中,您需要小心地同步对缓存值的访问,因为您将在不同的线程中进行读写。

(Pseudo-code)
onSensorChanged(SensorEvent event) {
    synchronized(cached_values) {
        cached_values[event.sensor.getType()] = event.values;
    }
}

//on a separate thread:
run() {
   while (true) {
       Thread.sleep(1000);
       synchronized(cached_values) {
           writeCsvLine(cached_values);               
       }
   }
}

或者,不是每隔1秒检查一个单独的线程,而是可以存储上次写入值的时间,然后当您获得新值时,检查是否为1秒(或者您想要的任何间隔)自上次写入数据以来已经过去了,如果是,请使用当前缓存的值写一个新的CSV行。

(Pseudo-code)
onSensorChanged(SensorEvent event) {
    long currentTime = System.currentTimeMillis();
    cached_values[event.sensor.getType()] = event.values;
    if (currentTime - lastWrittenTime >= 1000) {
        writeCsvLine(cached_values);
        lastWrittenTime = currentTime;
    }
}