我是android编程的新手。我需要开发一个从陀螺仪读取数据的应用程序,采样时间为 0.05 秒。我需要每 0.05 秒获取一个数据。
我查看了 android 的传感器管理器,它提供了四种不同类型的采样率,但它们并不统一。
我是android编程的新手。我需要开发一个从陀螺仪读取数据的应用程序,采样时间为 0.05 秒。我需要每 0.05 秒获取一个数据。
我查看了 android 的传感器管理器,它提供了四种不同类型的采样率,但它们并不统一。
您正在为哪个 API 开发?从 API 11 开始,您还可以指定从传感器获取结果的延迟。通常,传感器将注册四个固定延迟:
SensorManager.SENSOR_DELAY_NORMAL(延迟 200000 微秒)(默认值) SensorManager.SENSOR_DELAY_GAME(延迟 20000 微秒) SensorManager.SENSOR_DELAY_UI(延迟 60000 微秒) SensorManager.SENSOR_DELAY_FASTEST(延迟 0 微秒)
传感器将按如下方式注册:
mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_NORMAL);
因此,如果您正在开发 API 11,您可以注册
mSensorManager.registerListener(this, mSensor, 50000);
如果不是,那就很难了,你不能每 0.05 秒得到一次结果,但你可以通过设置 SENSOR_DELAY_UI 每 0.06 秒得到一次结果。另一种可能性是设置 SENSOR_DELAY_FASTEST 并使用类似的东西计数到 50000
private int value = 0:
和每个 onSensorChanged() 事件
value++;
直到你达到 50000。但这不是一个好的做法,因为传感器只有在他可以的情况下才会触发事件。如果系统高度繁忙,则无法保证传感器每次都在触发。
从 API 19 (2013+) 开始,有一个新的注册 API 变体,您可以在其中提及您希望在什么时间间隔接收传感器读数。从文档:
boolean registerListener (SensorEventListener listener, Sensor sensor, int samplingPeriodUs, int maxReportLatencyUs) 在给定的采样频率和给定的最大报告延迟下为给定的传感器注册一个 SensorEventListener。
此函数类似于 registerListener(SensorEventListener, Sensor, int),但它允许事件在传递之前暂时停留在硬件 FIFO(队列)中。事件可以存储在硬件 FIFO 中,最长可达 maxReportLatencyUs 微秒。一旦需要报告 FIFO 中的事件之一,则顺序报告 FIFO 中的所有事件。这意味着将在最大报告延迟过去之前报告某些事件。
事件的接收速度可能快于或慢于指定的速率
来自https://developer.android.com/reference/android/hardware/SensorManager.html
事件的接收速度可能比指定的速率快或慢。通常会更快地接收到事件。可以是 SENSOR_DELAY_NORMAL、SENSOR_DELAY_UI、SENSOR_DELAY_GAME、SENSOR_DELAY_FASTEST 或以微秒为单位的延迟之一。