安卓加速度计每次返回相同的值 [英] Android Accelerometer return same value every time

查看:0
本文介绍了安卓加速度计每次返回相同的值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试记录加速度计的每秒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.中注册监听程序这非常重要。然后,当你的计时器滴答作响时,确保你记录了这些值。通过将onSensorChangedtimer.scheduleAtFixedRate方法设置为包私有(即确保在类的顶部对其进行初始化),确保变量可用于onSensorChangedtimer.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
}
您可能必须将计时器代码添加到onCreateonStart方法中,我不确定您的项目是什么样子,但在合适的地方实现它。

这篇关于安卓加速度计每次返回相同的值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆