在 Android 上存储传感器数据和转储事件文件
Storing sensor data and dumping event file on Android
我编写了一个 Android 7 应用程序,用于在 SQLite 数据库中存储我的 smartphone 的传感器数据。例如,对于加速度计,我得到的值如下:
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
Sensor mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_UI);
public final void onSensorChanged(SensorEvent event) {
long timeNano = System.nanoTime();
long timeMilli = System.currentTimeMillis();
// Save to database
}
可以看出,在每次调用 onSensorChanged
时(即当新的传感器值到达时),我还会检索并存储当前时间戳(以毫秒和纳秒为单位)。我认为检索这些时间戳总是需要一些时间(几十毫秒)。我的传感器采样率很高。
当我为我得到的每个传感器值检索时间戳时是否有问题?我担心的只是我在传感器值中添加了人为延迟(排队),以防传感器值比检索毫秒和纳秒时间戳更快地到达。
其次,我还想转储 /dev/input/event7
文件(在有根目录的 phone 上)。我可以将其直接存储在数据库中(与传感器数据一样),也可以将其转储到文本文件中。
哪一个是更好的选择,文本文件是否有可能损坏(例如,最后没有正确关闭或出现写入错误)?我认为数据库是安全的,应该始终处于一致状态。
SENSOR_DELAY_UI
= 60,000 微秒 = 60,0 毫秒延迟。
我们无法确定获取时间戳的速度。
在昂贵的设备上,这可能需要 10 毫秒。在便宜的设备上,可能需要 100 毫秒。
此外,将数据存储在 database/file 中会增加很多毫秒,启动新线程以离岸该过程也是如此。
快速提醒:不要忘记您指定的延迟是只是一个建议的延迟,因此延迟可以低于指定的延迟。 Source
因此:在您的超高速手机上获取这些时间戳可能不是问题,因为它足够快,可以获取时间戳并将其存储在 database/file 中,但在其他速度较慢的手机。
你的阅读会有差距。例如,如果对 onSensorChanged()
的一次调用需要10秒,每50微秒函数就是指定的延时,那么每10秒和每10秒加50微秒之间就会调用一次
您可以接受有时不得不 "skip" 拨打 onSensorChanged()
电话这一事实。要降低发生这种情况的可能性,您可以指定更大的延迟。您可以指定以微秒为单位的自定义延迟时间
mSensorManager.registerListener(this, mAccelerometer, 1000*1000);
关于你的第二个问题:
我不太了解有根电话,但我知道文件。
读出 /dev/input/event7 并将其存储在数据库中可能比将内容快速写入某些文本文件需要更长的时间,如果这仍然是快速的话。
如果您有 2 个写入操作同时写入 1 个文件,则会发生文本文件损坏。在打开第二个输出流之前,您应该始终关闭第一个输出流。通常,捕获写入错误时,总是关闭输出流。做这两件事确保没有文件损坏。
通常来说,写入数据库比写入文本文件更安全,因为数据库旨在处理多次写入、潜在危险的写入等。
我编写了一个 Android 7 应用程序,用于在 SQLite 数据库中存储我的 smartphone 的传感器数据。例如,对于加速度计,我得到的值如下:
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
Sensor mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_UI);
public final void onSensorChanged(SensorEvent event) {
long timeNano = System.nanoTime();
long timeMilli = System.currentTimeMillis();
// Save to database
}
可以看出,在每次调用 onSensorChanged
时(即当新的传感器值到达时),我还会检索并存储当前时间戳(以毫秒和纳秒为单位)。我认为检索这些时间戳总是需要一些时间(几十毫秒)。我的传感器采样率很高。
当我为我得到的每个传感器值检索时间戳时是否有问题?我担心的只是我在传感器值中添加了人为延迟(排队),以防传感器值比检索毫秒和纳秒时间戳更快地到达。
其次,我还想转储 /dev/input/event7
文件(在有根目录的 phone 上)。我可以将其直接存储在数据库中(与传感器数据一样),也可以将其转储到文本文件中。
哪一个是更好的选择,文本文件是否有可能损坏(例如,最后没有正确关闭或出现写入错误)?我认为数据库是安全的,应该始终处于一致状态。
SENSOR_DELAY_UI
= 60,000 微秒 = 60,0 毫秒延迟。
我们无法确定获取时间戳的速度。 在昂贵的设备上,这可能需要 10 毫秒。在便宜的设备上,可能需要 100 毫秒。
此外,将数据存储在 database/file 中会增加很多毫秒,启动新线程以离岸该过程也是如此。
快速提醒:不要忘记您指定的延迟是只是一个建议的延迟,因此延迟可以低于指定的延迟。 Source
因此:在您的超高速手机上获取这些时间戳可能不是问题,因为它足够快,可以获取时间戳并将其存储在 database/file 中,但在其他速度较慢的手机。
你的阅读会有差距。例如,如果对 onSensorChanged()
的一次调用需要10秒,每50微秒函数就是指定的延时,那么每10秒和每10秒加50微秒之间就会调用一次
您可以接受有时不得不 "skip" 拨打 onSensorChanged()
电话这一事实。要降低发生这种情况的可能性,您可以指定更大的延迟。您可以指定以微秒为单位的自定义延迟时间
mSensorManager.registerListener(this, mAccelerometer, 1000*1000);
关于你的第二个问题: 我不太了解有根电话,但我知道文件。
读出 /dev/input/event7 并将其存储在数据库中可能比将内容快速写入某些文本文件需要更长的时间,如果这仍然是快速的话。
如果您有 2 个写入操作同时写入 1 个文件,则会发生文本文件损坏。在打开第二个输出流之前,您应该始终关闭第一个输出流。通常,捕获写入错误时,总是关闭输出流。做这两件事确保没有文件损坏。
通常来说,写入数据库比写入文本文件更安全,因为数据库旨在处理多次写入、潜在危险的写入等。