Android检测到正确的手机震动

时间:2016-07-07 06:23:46

标签: android

我正试图通过以下代码检测到正确的手机震动,但是它无法正常工作,例如,当我向左摇动手机时,我得到RIGHT或同时获得RIGHTLEFT

@Override
    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) > 200) {
                long diffTime = (curTime - lastUpdate);
                lastUpdate = curTime;

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

                if (Round(x, 4) > 10.0000) {
                    Toast.makeText(this, "Right shake detected", Toast.LENGTH_SHORT).show();
                } else if (Round(x, 4) < -10.0000) {
                    Toast.makeText(this, "Left shake detected", Toast.LENGTH_SHORT).show();
                }

                last_x = x;
                last_y = y;
                last_z = z;
            }
        }
    }

POST UPDATED:

if (Utils.Round(x, 4) > 8.0000) {
    //left
} else if (Utils.Round(x, 4) < -8.0000) {
    //right
} else if (z > 9 && z < 10)
    //down
else if (z > -10 && z < -9)
    //up

1 个答案:

答案 0 :(得分:2)

考虑一下加速度计的工作原理。它检测加速度。当您将手机向右移动时,您将获得向右的加速度,然后在以恒定速度移动时获得0。当你的手停止时,你会在减速时看到负加速度(向左加速度),当你停止时加速度再次达到0。

换句话说,您将始终看到每个动作的正/负对。当你看到两者时,那是因为它们中的每一个都足以触发过滤器。当你看错了,这意味着加速度太慢而无法触发它,但减速速度足够快。你没有进行足够长时间的去抖动 - 因为你的震动没有检测到它必须是向右移动的减速度,它在200ms开始和结束。不够长。如果你想要非常好的结果,你应该研究DSP算法,但是重复所有这些概念本身就是一本小书。

还要记住加速度响。加速度计的工作方式是对由弹簧拉伸的弹簧进行物理成像。它将超过中位数,然后反弹并多次这样做。该波与后来的数据的干扰会带来奇怪的结果。甚至可能有一个强大的环可以多次跳闸过滤器。

哦,你也不应该在这里使用currentTimeMillis。传感器事件具有时间字段。那是事件发生的时候。如果系统繁忙,可能会在事件处理前几百毫秒。在事件字段中使用时间,而不是您在其中处理时间。修复可能会有所帮助,尽管它会留下其他问题。