Android Sensor 同时记录值

标签 android events android-sensors

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

安华

最佳答案

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

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

最简单的方法是缓存每个传感器的值,然后每当您获得任何传感器的新数据时,您更新该传感器的缓存值,然后写入一个包含所有缓存传感器值的新 CSV 行。这一新的 CSV 行将仅与您刚刚更新其数据的 1 个传感器的前一行不同。

(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;
}

另一种方法是在获取传感器值时缓存它们,然后在单独的线程中,每隔一秒获取“当前”值,并将它们写出。在这种方法中,您需要小心同步对缓存值的访问,因为您将在不同的线程中读取和写入。

(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;
    }
}

关于Android Sensor 同时记录值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6682060/

相关文章:

javascript - Phonegap/jQuery 移动页面转换闪烁

android - 查找 read() 的 AndroidAccessory 文档

android - 如何给布局文件夹名称以支持android中的多种屏幕尺寸

javascript - 字符计数器超慢 - jQuery

java - 如果传感器检测到一定量的移动,则播放歌曲

android - 检测 Android 设备上的运动模式

android - 如何计算 Android 手机离地面的高度

android - android.databinding.Observable 的位置在哪里?

c# - 将应用程序中的所有事件归为一类是否是一种不好的做法?

c# - 如何从另一个窗体在窗体图片框上绘制矩形