Android - 用户定义的延迟用于registerListener()。不工作,为什么?

时间:2013-05-28 03:14:10

标签: android android-sensors

我正在尝试从Android手机传感器读取值。 我按如下方式初始化传感器:

private void sensorInit() {
    sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
    sensorManager.registerListener(this,
            sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
            SensorManager.SENSOR_DELAY_FASTEST);
    sensorManager.registerListener(this,
            sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE),
            SensorManager.SENSOR_DELAY_FASTEST);
    sensorManager.registerListener(this,
            sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),
            SensorManager.SENSOR_DELAY_FASTEST);
}

然后我可以得到~350个样本/秒。

但是为了节省电力,我希望放慢速度。 所以我将SensorManager.SENSOR_DELAY_FASTEST修改为1000。 我希望传感器延迟为1000ms。 但显然它不起作用,因为我仍然可以获得~350个样本/秒的速率。

从Android页面:

  

public boolean registerListener(SensorListener listener,int sensors,   int rate,Handler handler)

     

参数

     

侦听器:传感器侦听器对象

     

传感器:注册到传感器的位掩码

     

率:事件发生率。这只是对系统的暗示。事件可能是   接收速度比指定速率更快或更慢。通常是事件   收到更快。该值必须是SENSOR_DELAY_NORMAL之一,   SENSOR_DELAY_UI,SENSOR_DELAY_GAME或SENSOR_DELAY_FASTEST。的 或,   事件之间所需的延迟,以微秒为单位。 指定   微秒延迟仅适用于Android 2.3(API级别9)   向前。对于早期版本,您必须使用SENSOR_DELAY_ *之一   常数。

     

处理程序:处理程序将传递传感器事件。

任何人都可以帮助我?

如何真正减慢传感器采样速度以节省电量? 提前谢谢。

4 个答案:

答案 0 :(得分:1)

贡献一点:

如果您使用任何推荐值,例如SensorManager.SENSOR_DELAY_NORMALSensorManager.SENSOR_DELAY_UI,则会使用这些值。如果你看一下实现:

private static int getDelay(int rate) {
        int delay = -1;
        switch (rate) {
            case SENSOR_DELAY_FASTEST:
                delay = 0;
                break;
            case SENSOR_DELAY_GAME:
                delay = 20000;
                break;
            case SENSOR_DELAY_UI:
                delay = 66667;
                break;
            case SENSOR_DELAY_NORMAL:
                delay = 200000;
                break;
            default:
                delay = rate;
                break;
        }
        return delay;
    }

您可以看到delay默认为除以下任何其他值:

/** get sensor data as fast as possible */
    public static final int SENSOR_DELAY_FASTEST = 0;
    /** rate suitable for games */
    public static final int SENSOR_DELAY_GAME = 1;
    /** rate suitable for the user interface  */
    public static final int SENSOR_DELAY_UI = 2;
    /** rate (default) suitable for screen orientation changes */
    public static final int SENSOR_DELAY_NORMAL = 3;

所以只要你的价值不是0,1,3那么你就可以了,应该使用你的。

答案 1 :(得分:0)

尝试SensorManager.SENSOR_DELAY_NORMALSensorManager.SENSOR_DELAY_UI

答案 2 :(得分:0)

我在项目中使用的替代方案。它是这样的:

  1. 设置每隔android.app.AlarmManagersetRepeating的警报(x)。
  2. 在警报onReceive的{​​{1}}中,传感器设置方便。
  3. registerListener' SensorEventListener中,根据需要使用onSensorChanged的值。然后是event
  4. 步骤2和3将每unregisterListener秒重复一次。

    我希望我会粘贴所有代码,但它很长并且与其他功能交织在一起,我相信你可以在网上找到所有细节。

答案 3 :(得分:0)

请注意,param samplingPeriodUs 需要几微秒。 因此,如果您希望更新时间为1秒。您应该将1_000_000传递给函数