我正在尝试从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_ *之一 常数。
处理程序:处理程序将传递传感器事件。
任何人都可以帮助我?
如何真正减慢传感器采样速度以节省电量? 提前谢谢。
答案 0 :(得分:1)
贡献一点:
如果您使用任何推荐值,例如SensorManager.SENSOR_DELAY_NORMAL
或SensorManager.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_NORMAL
或SensorManager.SENSOR_DELAY_UI
答案 2 :(得分:0)
我在项目中使用的替代方案。它是这样的:
android.app.AlarmManager
秒setRepeating
的警报(x
)。 onReceive
的{{1}}中,传感器设置方便。registerListener
' SensorEventListener
中,根据需要使用onSensorChanged
的值。然后是event
。步骤2和3将每unregisterListener
秒重复一次。
我希望我会粘贴所有代码,但它很长并且与其他功能交织在一起,我相信你可以在网上找到所有细节。
答案 3 :(得分:0)
请注意,param samplingPeriodUs 需要几微秒。 因此,如果您希望更新时间为1秒。您应该将1_000_000传递给函数