【问题标题】:Android: Prevent phone vibrate function from affecting accelerometer dataAndroid:防止手机振动功能影响加速度计数据
【发布时间】:2014-02-04 03:23:12
【问题描述】:

我设计了一个应用程序,它可以使用加速度计跟踪我何时移动,并且可能会根据我可能达到的各种阈值来振动手机。我面临的问题之一是这种振动会直接破坏加速度计数据。

This 回答建议使用低通滤波器,但我认为这不适用于此应用程序(我需要相对较快的响应时间,并且振动会导致数据出现较大的尖峰)。

我目前使用的解决方案是在手机振动之前将标志设置为 true,调用 postDelayed 函数,该函数将在一定时间(1 秒以内)后将其设置回 false,然后在onSensorChanged 函数,如果标志为真则返回。

换句话说:

isPhoneVibrating = true; // Start to vibrate     
phoneVibrator.vibrate(VibratePattern, -1);
mHandler.postDelayed(vibrateSensorOff, 1000); // 1 seconds wait before making false

vibrateSensorOff 只包含

isPhoneVibrating = false;

就像我说的,在 onSensorChanged 函数中,如果标志 isPhoneVibrating 为真,我会返回。

我不喜欢这个解决方案,因为我需要在这个应用程序的各种状态下管理这个额外的标志。还有其他不需要额外标志的可能解决方案吗?

【问题讨论】:

    标签: android sensors vibration


    【解决方案1】:

    您可以有两个单例来跟踪手机是否振动并管理VibratorAccelerometer

    Accelerometer 管理器应该公开您用于Accelerometer 的方法,并且如果Vibrator 没有运行,则应该传递所有事件(这就像加速度计数据的过滤器)。如果手机在Accelerometer 管理器上振动,您应该有一个内部标志以及设置它的方法。

    Vibrator 经理应该公开您用于Vibrator 的方法,并且还应该在手机开始振动时更新Accelerometer 经理的标志。

    这些基本上是应用程序中 VibratorAccelerometer 实例的包装器,但它们应该允许您使用 Accelerometer 而不必担心应用程序中各处的 Vibrator 标志(仅限经理对象应该照顾那个标志)。

    我知道此解决方案确实需要一个额外的标志,但它允许您仅在两个位置(在两个单例中)管理该标志,并且您不必在整个应用程序中跟踪它。如果您确实实现了这两个单例,请确保您不直接使用VibratorAccelerometer(因为您必须跟踪振动标志才能做到这一点)。

    【讨论】:

    • 感谢您的回答。今晚我会试试这个。似乎我会做一些与我已经做的事情类似的事情(即设置标志,然后在不久之后取消设置),但有利于将该操作隐藏在单例中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多