Android:加速度计错误检测

2023-12-24

我有一个代码片段来检测加速度计的运动。有时它可以通过正确检测轻微的运动来工作,但有时当我保持设备空闲时它也会检测到运动。 Android 上的内置加速度计检测是否存在问题?

我使用 HTC G-1 设备。我的代码片段如下。如何解决该问题,以便我可以检测到设备的微小移动,但在设备空闲时检测不到任何内容?

private static final int SHAKE_THRESHOLD = 50;

public void onSensorChanged(int sensor, float[] values) {

    if (sensor == SensorManager.SENSOR_ACCELEROMETER) {
        long curTime = System.currentTimeMillis();
        // only allow one update every 100ms.
        if ((curTime - lastUpdate) > 100) {
            long diffTime = (curTime - lastUpdate);
            lastUpdate = curTime;

            x = values[SensorManager.DATA_X];
            y = values[SensorManager.DATA_Y];
            z = values[SensorManager.DATA_Z];

            float speed = Math.abs(x+y+z - last_x - last_y - last_z) / diffTime * 10000;

            if (speed > SHAKE_THRESHOLD) { 
                long curTime = System.currentTimeMillis();
                long diff = (curTime - shakeTime);              
                shakeTime = curTime;

                if (myFlagIgnoreShakeDetection==true)  //Caused unneccessary accelerometer   
                                                       //notification looping when device is idle
                   return;

                // Doing something...
            }
         last_x = x;
         last_y = y;
         last_z = z;
        }

    }

}

以下是一些代码差异...

  • 更新可能有问题last_x, last_y, and last_z。我相信他们应该被包括在内inside the if ((curTime - lastUpdate) > 100) {陈述。换句话说,它们每次都会更新onSensorChanged被调用,不是每 100 毫秒调用一次。您可能应该将这三个变量的更新移到它们上方的大括号中。

  • 在您计算的行上speed,公式结尾为... / diffTime * 10000;你想乘以diffTime乘以 10000,还是整个结果?自从/ and *通常具有相同的运算符优先级 http://en.wikipedia.org/wiki/Order_of_operations在我所知道的大多数语言中(例如Java http://www.cs.uwf.edu/~eelsheik/cop2253/resources/op_precedence.html),您的方程将从左到右计算,首先除以diffTime then将该结果乘以 10000。

    我猜你的意思是乘以diffTime10000,因此dividing最终结果就是这个金额。这是除以 10000 或乘以 10000 之间的差异,这意味着您可能会得到以下值speed比您应有的值大 10^8,因此即使在设备空闲时也会触发您的阈值。您需要在乘法两边加上括号,例如... / (diffTime * 10000);,以确保其执行before分裂发生。

    此外,如果您打算扩展diffTime从毫秒到秒,比例因子应该是 1000。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android:加速度计错误检测 的相关文章

随机推荐