【问题标题】:How to get x, y, z values from Android Accelerometer sensor on a regular frequency, for instance per 20ms, 40 ms or 60 ms如何以常规频率(例如每 20 毫秒、40 毫秒或 60 毫秒)从 Android 加速度计传感器获取 x、y、z 值
【发布时间】:2011-08-09 08:39:31
【问题描述】:
我在做一个Android项目,遇到了以下情况:
现在我们需要常规频率的加速度计值,例如 20ms、40ms 或 60ms
现在我们是 SENSOR_DELAY_GAME,但我们发现不同的设备对此参数有不同的间隔。例如,G2 使用 40ms,G7 使用 60ms,Nexus S 使用 20ms。
我尝试设置定时器或使用thread.sleep,但由于Java的GC问题,他们无法让系统以固定频率获取值。
这很烦人,如果有人知道在 Android SDK 中是否有适当的方法可以让我以常规频率获取加速度计值,那将非常有帮助!
非常感谢!
【问题讨论】:
标签:
android
garbage-collection
accelerometer
frequency
android-sensors
【解决方案1】:
我通过简单地丢弃比我想要的更早的值来做到这一点。从电池消耗的角度来看并不理想,因为我需要让传感器比我需要的更频繁地为我供电,但至少我可以控制它们定期进入。
类似:
static final int ACCEL_SENSOR_DELAY = 100; // the number of milisecs to wait before accepting another reading from accelerometer sensor
long lastAccelSensorChange = 0; // the last time an accelerometer reading was processed
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
if (sensorEvent.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE) return;
long now = System.currentTimeMillis();
if (now-ACCEL_SENSOR_DELAY > lastAccelSensorChange) {
lastAccelSensorChange = now;
mCompassValues = event.values.clone();
//... do your stuff
}
【解决方案2】:
我已经构建了一个代码,可以让您在任何设备上获得准确的频率。
您可以下载here该项目并获得一些解释。
在代码中,您可以尝试不同的费率。例如,我的 Galaxy S2 上的正常模式是 5Hz。
【解决方案3】:
使用registerListener,设置采样周期如下:
boolean registerListener (SensorEventListener listener, Sensor sensor, int samplingPeriodUs)
Source
注意事项:samplingPeriodUs 参数只是对系统的提示。使用前先测试一下。