【问题标题】:Android how to set sensor delay?Android如何设置传感器延迟?
【发布时间】:2015-05-10 16:38:51
【问题描述】:

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

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);

一切正常,除了延迟,它几乎看起来像是实时更新。我使用了与https://stackoverflow.com/a/23060896/1667868 类似的代码,并进行了一些小改动。

注意:我使用的最低api版本是14

【问题讨论】:

    标签: android android-sensors


    【解决方案1】:

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

    一旦事件可用,事件将立即传送到提供的 SensorEventListener。为了降低功耗,应用程序可以改用 registerListener(SensorEventListener, Sensor, int, int) 并指定一个正的非零最大报告延迟。

    虽然传感器的读数以给定的间隔进行采样,但该方法中的报告间隔未指定,导致一旦有读数可用,就会迅速调用回调。使用文档中提到的替代方法:

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

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

    请注意,文档声称最后一个参数 maxReportLatencyUs 是:

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

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

    【讨论】:

    • registerListener (this, mAcceleroSensor, 1000000, 1000000)的最低api版本是19,我目前使用14来支持android 4
    • @SvenB 哦,好吧,考虑到即使文档说要使用常量并且 samplingPeriodUsonly a hint to the system.Events may be received faster or slower than the specified rate. Usually events are received faster. (直接来自文档),我建议你采取将结果缓存在平均缓冲区(或 LinkedList)中并在发送到 UI 之前每秒计算平均值以获得更一致的体验的方法。如果设备的SDK等级为19+,也可以编写条件代码调用4arg方法
    猜你喜欢
    • 2013-08-06
    • 2013-03-30
    • 2021-03-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    相关资源
    最近更新 更多