Android检测正确的手机震动

标签 android

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

@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;
            }
        }
    }

更新后:

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

最佳答案

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

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

还请记住,加速度响起。加速度计的物理工作方式 - 想象一个被重物拉伸(stretch)的 Spring 。它会超过中位数,然后反弹并重复多次。该波对后来数据的干扰会带来奇怪的结果。强烈的响声甚至可能会多次触发您的过滤器。

哦,你也不应该在这里使用 currentTimeMillis。传感器事件有一个时间字段。那是事件真正发生的时候。如果系统繁忙,可能需要几百毫秒才能处理事件。使用事件字段中的时间,而不是您处理它的时间。解决这个问题可能会有所帮助,但会留下其他问题。

关于Android检测正确的手机震动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38238721/

相关文章:

android - 如何在 flutter 中使用for循环?

java - 在 SurfaceView 上加载和显示 jpeg 的最快方法?

android - 使用 Android 模拟器进行远程调试

java - 如果启用了 proguard,如何获取类字段?

android - AsyncStorage 在 Android 上无法正常使用 React Native

php - MySQL和PHP解析奇怪的字符串

android - sqlite android select col(x) where (col1 like '%key%' ) or (col2 like '%key%' ) - x 是包含键的列

javascript - 检测浏览器在网页中是否有键盘/箭头键

android - google 和 maven 存储库之间的 play-services-measurement-base 版本不匹配

Android - 如何以编程方式添加 VPN 网络