是否有可能将加速度计更新频率减慢到 1hz 以及如何?
我已经在 nexus 7 选项卡上尝试过:将 sensorDelay_Normal 更改为 1.000.000 但没有任何改变。谢谢你!
这是代码:
mAccelerometer.registerListener(listener,mAccelerometer.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),SensorManager.1000000);
是否有可能将加速度计更新频率减慢到 1hz 以及如何?
我已经在 nexus 7 选项卡上尝试过:将 sensorDelay_Normal 更改为 1.000.000 但没有任何改变。谢谢你!
这是代码:
mAccelerometer.registerListener(listener,mAccelerometer.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),SensorManager.1000000);
这就是我获得 1Hz 加速度的方式:
static int ACCE_FILTER_DATA_MIN_TIME = 1000; // 1000ms
long lastSaved = System.currentTimeMillis();
@Override
public void onSensorChanged(SensorEvent event) {
if ((System.currentTimeMillis() - lastSaved) > ACCE_FILTER_DATA_MIN_TIME) {
lastSaved = System.currentTimeMillis();
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
}
}
您始终可以忽略测量值,但每秒一次除外。还是要备用电池?
好的,我找到了解决方案:
public static final double accFreq = 15; //15 = 1 sec
long nowA = 0;
long timeA = 0;
int tempA = 0;
public SensorEventListener listener = new SensorEventListener() {
long tSA;
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
// Get timestamp of the event
tSA = event.timestamp;
if (nowA != 0) {
tempA++;
if (tempA == settings.accFreq) {
timeA = tSA - nowA;
tempA = 0;
Log.e("Accelerometer:", "" + x + " " + y + " " + z);
}
}
if (tempA == 0) {
nowA = tSA;
}
}
}
这是我可以让它在 1Hz 下工作的唯一方法!
传感器速度值的自定义值效果不佳。
如果您查看该类,您会在每个 .registerListener() 方法中找到“getDelay”函数。
public boolean registerListener(SensorEventListener listener, Sensor sensor, int rateUs,
int maxBatchReportLatencyUs) {
int delay = getDelay(rateUs);
return registerListenerImpl(listener, sensor, delay, null,maxBatchReportLatencyUs, 0);
}
Wich 也在同一个类中定义:
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;
}
所以通常它应该可以设置自定义值。但是,如果您尝试使用高于约 100 毫秒(100000微秒)的自定义值,则事件之间的测量时间可能会跳到 1000 毫秒并停留在那里。如果您使用 1000 ,2000 或更高的毫秒数,则事件之间的时间仍然约为 1000 毫秒。
您可以使用 SENSOR_DELAY_NORMAL (= 200 毫秒)并通过每次检查(就像大卫所做的那样)通过足够的时间来捕获事件每次。
使用当前方法,应用程序仍然每 60 毫秒获取一次事件。仅仅因为它丢弃了 15 个事件中的 14 个,并不能减少电池消耗,因为传感器硬件仍然需要每 60 毫秒处理一次数据,并且系统接收它并将其发送到应用程序。即没有太多的电池节省。
(nitpick alert)为了准确使用上述方法,需要从 16 或 17 个事件中挑选一个样本,因为每个事件平均发生在 60 毫秒左右。
在注册多个 sensorEventListener 时设备冻结SENSOR_DELAY_NORMAL
不是 Android 框架的问题(它可以轻松处理该场景)。这表明应用程序的编写方式存在问题。首先要查找的是主 UI 线程中的大量 CPU 密集型代码。遵循开发人员指南,通过注册的多个 sensorEventListener()和多个执行 cpu 密集型计算的工作线程来使应用程序响应。SENSOR_DELAY_NORMAL