Android如何设置传感器延迟?

时间:2015-05-10 16:38:52

标签: android android-sensors

对于我的项目,我创建了一个使用用户设备的传感器来检测北方的类。我只需要每秒钟更新一次,希望延迟更长时间节省一些电池,但我不能让延迟工作。我有什么:

mAcceleroSensor = mSensorManagerAccelero.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
mMagneticSensor = mSensorManagerMagnetic.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
// Tried to set normal values like SensorManager.SENSOR_DELAY_NORMAL
// and numbers like 100 - 100.000. 1.0000.0000 
// (without the dots only here to make it readable here).
mSensorManagerAccelero.registerListener(this, mAcceleroSensor, 50000000);
mSensorManagerMagnetic.registerListener(this, mMagneticSensor, 50000000);

一切正常,除了延迟它几乎看起来像它的更新现场。我已经使用代码similair来https://stackoverflow.com/a/23060896/1667868进行一些改动。

注意:我使用的最小api版本为14

1 个答案:

答案 0 :(得分:2)

SensorManager.registerListener(SensorEventListener listener, Sensor sensor, int samplingPeriodUs)的文档:

  

事件将在可用时立即传递给提供的SensorEventListener。为了降低功耗,应用程序可以使用registerListener(SensorEventListener,Sensor,int,int),并指定正的非零最大报告延迟。

虽然传感器的读数以给定的间隔进行采样,但未指定该方法中的报告间隔,从而导致在读数可用时立即快速调用回调。使用文档中提到的替代方法:

 mSensorManagerAccelero.registerListener (this, mAcceleroSensor, 1000000, 1000000)

让它在大约一秒左右报告(您可以根据需要手动调整采样率)。这也有助于用电。

请注意,文档声称最终参数maxReportLatencyUs是:

  

在报告给应用程序之前可以延迟事件的最长时间(以微秒为单位)。

意味着它可能仍然会以超过1秒的速度报告。如果您希望用户看到一致的平滑1秒更新,请考虑将结果保存到平均缓冲区并每秒更新一次UI。