2

我正在尝试从 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。我希望传感器延迟为 1000 毫秒。但显然它不起作用,因为我仍然获得约 350 个样本/秒的速率。

从安卓页面:

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

参数

listener:传感器监听对象

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

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

handler:传感器事件将被传递到的 Handler。

任何人都可以帮助我吗?

我怎样才能真正减慢传感器采样速度以节省电力?提前致谢。

4

4 回答 4

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,那么您就可以了,应该使用您的值。

于 2016-06-12T17:38:26.977 回答
0

尝试SensorManager.SENSOR_DELAY_NORMALSensorManager.SENSOR_DELAY_UI

于 2013-05-28T03:22:01.167 回答
0

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

  1. 设置一个警报 ( android.app.AlarmManager),setRepeating每隔x几秒。
  2. 在您方便的传感器设置onReceive的警报。registerListener
  3. SensorEventListener'中根据需要onSensorChanged使用event' 值。然后unregisterListener

步骤 2 和 3 将每秒钟重复一次x

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

于 2015-01-23T15:22:25.057 回答
0

请注意,参数samplingPeriodUs需要微秒。因此,如果您想要 1 秒的更新。您应该将 1_000_000 传递给函数

于 2018-06-14T14:19:52.273 回答