gpt4 book ai didi

java - Android 加速计每次返回相同的值

转载 作者:行者123 更新时间:2023-12-02 11:31:54 25 4
gpt4 key购买 nike

我试图记录每秒 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,加速度计,sensorManager.SENSOR_DELAY_NORMAL);

sensorManager.unregisterListener(JumpingBall.this);

从您的 onSensorChanged 方法并将您的 sensorManager.registerListener 放入您的 main/当您启动上下文并将您的 sensorManager.unregisterListener 放入你的 onFinished/当你完成你的上下文时。

https://developer.android.com/guide/topics/sensors/sensors_motion.html

这里还提供了有关如何设置某些传感器(包括加速度计)的一些示例的链接。您可以看到他们如何在顶部初始化所有传感器,然后使用 onSensorChanged 记录数据。

编辑:

下面是我要做的。让您的 onSensorChanged 仍然在每次加速度计感测到某些东西时记录事件,这就是您想要做的。请确保在 onCreate 中注册您的监听器。 这非常重要。然后,当计时器滴答作响时,请确保记录下这些值。通过将变量设为包私有(private)(即确保在类的顶部初始化它们),确保变量可用于 onSensorChangedtimer.scheduleAtFixedRate 方法。您也不需要只运行一次的 for 循环,那么它就不是循环。

所以,这个想法是始终读取值,但仅每 250 毫秒记录一次。正如另一位用户指出的那样,每次发生新事件时,您都会创建一个新计时器,这不是您想要做的。尝试实现下面的代码:

//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\
}

您可能需要将计时器代码添加到您的 onCreateonStart 方法中,我不确定您的项目是什么样的,但在适当的地方实现它。

关于java - Android 加速计每次返回相同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49235317/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com