Android-如何检测指南针度数的变化(Java)

Android-如何检测指南针度数的变化(Java),java,android,compass,Java,Android,Compass,我有下面的代码,在我的Nexus5上完美地工作 传感器更改时的公共无效(传感器事件){ float degree=Math.round(事件值[0]); displayMsg.setText(String.valueOf(degree)); } 度数包含指南针的方向。我想做的是检测方向的变化。假设有人向北走,然后向右拐10度。当这个人改变方向时,我希望能够注意到。此外,还有不确定性。例如,当人向北行走时,方向不是恒定的0度。它将在358度和2-3度之间波动 我想到了使用定时器。计划每500毫秒

我有下面的代码,在我的Nexus5上完美地工作

传感器更改时的公共无效(传感器事件){ float degree=Math.round(事件值[0]); displayMsg.setText(String.valueOf(degree)); }
度数
包含指南针的方向。我想做的是检测方向的变化。假设有人向北走,然后向右拐10度。当这个人改变方向时,我希望能够注意到。此外,还有不确定性。例如,当人向北行走时,方向不是恒定的0度。它将在358度和2-3度之间波动

我想到了使用定时器。计划每500毫秒存储一次度数,然后做一次调整

if(数学abs(学位存储等级)>10)
Toast.makeText(这个“方向改变了”,Toast.LENGTH_SHORT).show();
但是,我认为,由于创建的线程数量,这个方法会耗尽内存。 有没有更聪明/更好的方法来检测方向的变化


更新

这是我正在做的全部代码

我在数步数,我想保持步数的方向。一旦方向改变了10度,步进计数器应该存储它的值(比如在数组列表中),然后转到0并重新开始计数

boolean start = true;

@Override
public void onSensorChanged(SensorEvent event) {
    //------------------------------Compass--------------------------------------
    final float degree = Math.round(event.values[0]);
    displayMsg.setText(String.valueOf(degree));
    //---------------------------------------------------------------------------

    Sensor sensor = event.sensor;
    float[] values = event.values;
    int value = -1;
    int steps;

    if (values.length > 0) {
        value = (int) values[0];
    }

    if(mode.equals("Start"))
    {
        if (sensor.getType() == Sensor.TYPE_STEP_COUNTER) 
        {
            if(start)
            {
                count = value;
                start = false;
            }
            steps = value-count;
            stepCounter.setText("Step Counter Detected : " + steps);
        } 
    }
}

我会使用低通滤波器来消除波动

代码如下:

protected float[] lowPass(float[] input, float[] output) {
    if (output == null) return input;
    for (int i = 0; i < input.length; i++) {
        output[i] = output[i] + ALPHA * (input[i] - output[i]);
    }
    return output;
}
在此之后,像这样使用方位角:

        if (azimut != null) {
            canvas.rotate(-azimut * 360 / (2 * 3.14159f), centerx, centery);

            if ((azimut > -0.2) && (azimut < 0.2)) current_direction = "North";
            if ((azimut > 1.3) && (azimut < 1.7)) current_direction = "East";
            if (((azimut < -2.8) && (azimut > -3.2)) || ((azimut < 3.2) && (azimut > 2.8))) current_direction = "South";
            if ((azimut > -1.7) && (azimut < -1.3)) current_direction = "West";
        }
if(方位角!=null){
画布旋转(-azimut*360/(2*3.14159f),centerx,centery);
如果((方位角>-0.2)和((方位角<0.2))当前方向为“北”;
如果((方位角>1.3)和((方位角<1.7))当前方向为“东”;
如果((方位<-2.8)和&(方位>-3.2))| |((方位<3.2)和&(方位>2.8)))当前_方向=“南”;
如果((方位角>-1.7)和((方位角<-1.3))当前方向为“西”;
}

我认为您的问题更多地与传感器有关,而不是您的逻辑。你可以试试这个,但我并不是真的在传感器方面失败。我知道定位服务可以为您提供设备方位(通过gps),这也可能是一种选择

能否检查当前度数的更改是否超过阈值,然后用新度数更新存储的值

一个可能的例子如下: 其思想是,由于每次更新值时都会调用onSensorChanged,因此可以检查当前度数与存储值之间的差异是否超过某个阈值。 如果是,则采取行动并存储新的学位,否则将忽略更改

private float storedDegree;

public void onSensorChanged(SensorEvent event) {
    if (sensor.getType() == Sensor.TYPE_ORIENTATION) {
        float degree = Math.round(event.values[0]);
        if(Math.abs(degree - storedDegree) > 10) {
            Toast.makeText(this,"Direction Changed",Toast.LENGTH_SHORT).show();
            displayMsg.setText(String.valueOf(degree));
            storedDegree = degree;
        }
    }
}

你的东西怎么了?似乎每次人员改变方向时都应该调用onSensorChanged,然后您只需将当前度数与存储值进行比较(如图所示)
onSensorChanged
不会在人员改变方向时调用。它经常被呼叫。我建议的问题是我使用
Timer=new Timer()然后
定时器。调度(timerTask,5000)
方法。但是这个方法的内存不足!我应该在哪里设置mGravity和mGeomagnetic?这些代码只是罗盘的不同操作方式。我想在方向发生10度变化时进行检测,我认为您需要显示更多的代码,并解释发生了什么
private float storedDegree;

public void onSensorChanged(SensorEvent event) {
    if (sensor.getType() == Sensor.TYPE_ORIENTATION) {
        float degree = Math.round(event.values[0]);
        if(Math.abs(degree - storedDegree) > 10) {
            Toast.makeText(this,"Direction Changed",Toast.LENGTH_SHORT).show();
            displayMsg.setText(String.valueOf(degree));
            storedDegree = degree;
        }
    }
}