Android Accelerometer return same value every time(安卓加速度计每次返回相同的值)
问题描述
我正在尝试记录加速度计的每秒4个采样值。因此,我每250毫秒重复一次我的逻辑(我也尝试了每秒4个采样)。 每次我的方法结束时,我注销传感器并在我的方法开始时重新注册(当我没有注销传感器时,我的逻辑在onSensorChanged中不起作用,并且它持续记录所有数据)。通过这种方法(每秒或每四分之一秒注册和注销传感器),我能够管理加速度计的采样率,但每次都返回相同的值。
这是我的onSensorChanged
方法。
@Override
public void onSensorChanged(final SensorEvent event) {
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
sensorManager.registerListener(JumpingBall.this, accelerometer, sensorManager.SENSOR_DELAY_NORMAL);
float deltaX1 = (float) ((event.values[0])/9.81);
float deltaY1 = (float) ((event.values[1])/9.81);
float deltaZ1 = (float) ((event.values[2])/9.81);
int i=0;
for (i=0;i<1;i++) {
listx.add(String.valueOf(deltaX1));
listy.add(String.valueOf(deltaY1));
listz.add(String.valueOf(deltaZ1));
}
sensorManager.unregisterListener(JumpingBall.this);
}
}, 0, 250);//put here time 1000 milliseconds=1 second
}
如果需要任何其他信息,请通知我。
推荐答案
不要每次都取消注册和注册监听器。尝试在onCreate或onStart方法中注册侦听器,并在onFinish上注销侦听器。
我非常确定您的错误来自于这样一个事实,即每次检测到变化时,您似乎都会"重置"您的加速度计。
换句话说,删除您的呼叫
sensorManager.registerListener(JumpingBall.this, accelerometer, sensorManager.SENSOR_DELAY_NORMAL);
和
sensorManager.unregisterListener(JumpingBall.this);
当您开始上下文时,将onSensorChanged
方法中的sensorManager.registerListener
放入Main/中,并在完成上下文后将sensorManager.unregisterListener
放入onFinded/中。
https://developer.android.com/guide/topics/sensors/sensors_motion.html
这里还提供了一些如何设置某些传感器(包括加速计)的示例的链接。您可以在顶部看到它们如何初始化传感器,然后使用onSensorChanged
记录数据。
编辑:
以下是我会做的事情。使您的onSensorChanged
仍然在每次加速度计检测到什么东西时记录事件,这就是您想要做的。确保在您的onCreate.
中注册监听程序这非常重要。然后,当你的计时器滴答作响时,确保你记录了这些值。通过将onSensorChanged
和timer.scheduleAtFixedRate
方法设置为包私有(即确保在类的顶部对其进行初始化),确保变量可用于onSensorChanged
和timer.scheduleAtFixedRate
方法。您也不需要只运行一次的for循环,那么它就不是一个循环。
因此,我们的想法是始终读取值,但仅每隔250ms记录它们一次。正如另一位用户所指出的,每次发生新事件时,您都会创建一个新的计时器,这不是您想要做的。尝试实现以下代码:
//Initialize these up top
private float deltaX1 = 0;
private float deltaY1 = 0;
private float deltaZ1 = 0;
@Override
public void onSensorChanged(final SensorEvent event) {
deltaX1 = (float) ((event.values[0])/9.81);
deltaY1 = (float) ((event.values[1])/9.81);
deltaZ1 = (float) ((event.values[2])/9.81);
}
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
listx.add(String.valueOf(deltaX1));
listy.add(String.valueOf(deltaY1));
listz.add(String.valueOf(deltaZ1));
}, 0, 250);//put here time 1000 milliseconds=1 second
}
您可能必须将计时器代码添加到onCreate
或onStart
方法中,我不确定您的项目是什么样子,但在合适的地方实现它。
这篇关于安卓加速度计每次返回相同的值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!