我正在编写一个作为后台服务运行并记录传感器数据的Android日志记录应用程序。 以下是我开始记录重力传感器的代码示例:
public void StartLogging(int intervalInMilliseconds) {
mySensorManager.registerListener(this, myGravitySensor, intervalInMilliseconds * 1000); //millisec * 1000 = microsec
}
然而,我遇到了一个问题:我设置的采样率完全被忽略,实际的采样率要快得多。 例如:即使我设置一个非常慢的10000000微秒的采样率(又名:10000毫秒,或10秒),我实际上每秒都会收到大约十几次更新,这比我要求的快一百多倍!
我在文档中读到间隔并不是严格精确的,但在这里我们谈论的是至少两个数量级的差异,这是荒谬的!
我知道我只能比较时间戳并且只记录每100个一个事件,但问题是我试图最小化功耗,我想每10秒唤醒CPU一次对电池产生的影响与每秒唤醒十次不同。
我也知道我可以传递第四个参数来设置传感器事件在传送之前可以留在队列中的时间,但是这似乎也没有任何明显的效果。< / p>
我哪里错了?
答案 0 :(得分:2)
它可以在某些手机中使用,但在其他手机中可能不起作用,实际上它取决于手机正在使用的传感器以及其他因素。
您不应该依赖该值,而应根据所需的费率过滤不需要的值。
干杯!!!
答案 1 :(得分:1)
根据其他答案,根本不可能: Android - user-defined delay is used in registerListener(). Not working, why?
如果无法使用samplerate参数,请尝试使用预定义的samplerate参数,看看它们是否有所不同。
如果采样率仍然太高,您可以使用计数器值,并且每X个样本只调用一次事件。
答案 2 :(得分:0)
虽然&#34;传感器管理器可以免费提供比您要求的样品更多的样品。这是一个很好的答案,它无法解释原因。我推断出以下两种解释可能会或可能不会在所有设备上都是正确的:
如果两个组件要求不同频率的传感器读数,它们都将以所请求的最高速率接收数据,这从效率的角度来看是有意义的,具体取决于传感器类型。请注意,跨流程也是如此,因此用于检测手机摇动手势的后台服务可能会影响共享速率。
传感器费率可以以意想不到的方式结合。例如,相机以适度的10Hz读取加速度计以确定方向,并且前述的抖动手势检测器可以以20Hz运行陀螺仪。现在,使用TYPE_ROTATION_VECTOR的第三个组件可能希望在SENSOR_DELAY_GAME运行,通常为50Hz。因为这个最后一个传感器(通常)是加速度计和陀螺仪的软融合,它似乎要求它们都以相同的频率运行,但是无法计算出应该是什么并放弃并以1KHz的频率运行(至少在我的一个设备上。)