按钮自动按下(可能是设备特定的)

时间:2015-03-26 17:28:18

标签: android android-fragments android-view android-hardware

我正在尝试解决我为Amnesty工作的open source Panic Button application棘手,难以重现(因此可能与硬件相关)的问题。有an issue on github about it

问题在于LinearLayout View with Buttons。当在this fragment中显示时,当我尝试按住按钮时,它会在一秒钟之后完全取消。记录onClick事件时,即使我没有从屏幕上释放手指,它也会自动触发。

这种情况发生在Cherry Gem手机上,我无法在其他手机上重现这个问题。

我一直在删除大量代码并添加大量日志语句,以便在我发现最奇怪的事情时尝试隔离错误,这导致我在Stack Overflow上发布这个,因为它很奇怪,可能有人会认识到图案:

当我在屏幕上拖动手指时,虫子会消失!更准确地说,在屏幕上确认按钮自动按下几次后,如果我按住并拖动手指,然后释放它,之后我可以按住按钮而不用它们自己压制。的笏吗

请注意,我并不是要求解决尝试检测长按的问题(当然这会导致这种问题),而是在我继续实施解决方法之前尝试理解这个不受欢迎的问题。因此,我也不愿意将事件移动到onTouch监听器,因为我担心它不能解决问题的根本原因,我想先了解为什么会发生这种情况。

我不是100%确定是否可能与代码的其余部分进行不必要的交互,并且如果没有人识别此处的模式,也会尝试从头开始创建一个简约项目,只有那些代码。< / p>

如果有帮助,我也可以发布一个小问题视频。我也很高兴发布代码摘录或logcat结果。

谢谢你的时间!

更新

我查看了the adb shell getevent log,确认在.9秒后有一个EV_KEY BTN_TOUCH UP 事件。这是否证实从操作系统的角度来看,它是从硬件接收关于按钮的事件?我想这可能也是由软件引发的。

这使我开始研究手机上安装的软件,可能会干扰输入设备。我已停用Google语音输入,然后按住按钮再次工作。重新激活Google语音输入并未使错误重新出现。重新启动手机然后重新出现错误。

我试着看一下只有一些应用程序受到影响。预安装的计算器也受到影响。使用默认虚拟键盘时,错误没有发生。但是当我回到我的应用程序时,bug再次消失了。再次重新启动。计算器仍受影响。返回使用浏览器中的虚拟键盘。现在这个bug仍然存在...... Wat?

过了一会儿,我再次移除了Google语音输入设备,错误再次消失。

我已经跟踪了一个论坛,其中似乎有这款手机的rom,我试图找出它是否比我的版本更新,或者是否有其他人使用这款手机也遇到了这个问题。< / p>

(我还更新了relevant github issue

更新2

我在logcat中注意到以下内容:

04-01 12:05:30.484: V/PhoneWindow(2749): DecorView setVisiblity: visibility = 0
04-01 12:05:30.525: V/InputMethodManager(2749): onWindowFocus: null softInputMode=288 first=true flags=#1810100
04-01 12:05:30.528: V/InputMethodManager(2749): START INPUT: com.android.internal.policy.impl.PhoneWindow$DecorView{41aa5ef8 V.E..... R.....ID 0,0-480,800} ic=null tba=android.view.inputmethod.EditorInfo@41a3fef8 controlFlags=#104
04-01 12:05:30.530: V/InputMethodManager(2749): Starting input: Bind result=InputBindResult{com.android.internal.view.IInputMethodSession$Stub$Proxy@41a48da8 com.android.inputmethod.latin/.LatinIME #45}
04-01 12:05:30.608: I/InputMethodManager(2749): handleMessage: MSG_SET_ACTIVE true, was false

这可能是问题的一部分吗?

1 个答案:

答案 0 :(得分:1)

对于诸如此类的奇怪问题,我认为覆盖 onTouchEvent 侦听器并观察触发了哪个 MotionEvent 非常有用(例如ACTION_MOVE,ACTION_UP /下)。根本问题可能是设备的触摸屏驱动程序。因此,使用onTouchEvent测试该驱动程序可能会很好。

我认为,有一个很好的网页@ Touch Device Configuration。搜索文本&#34;驱动程序报告信号强度为压力&#34;。我认为这很有趣,也许您只需更改touch.pressure的值。校准或/和比例进行故障排除。此文件具有idc的扩展名,应驻留在系统子目录中。

我想提供示例代码来覆盖鼠标/滑动事件:

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        switch (ev.getAction() & MotionEvent.ACTION_MASK) {
            // Make sure ACTION_DOWN is dispatched to children view
            case MotionEvent.ACTION_DOWN:
                onTouchEvent(ev);

                // Allow the children view to process this action
                return false;       // skip calling onInterceptTouchEvent

            case MotionEvent.ACTION_MOVE:
                onTouchEvent(ev);
                return false;

            default:
                break;
        }
        return super.onInterceptTouchEvent(ev);
    }

    @Override
    public boolean onTouchEvent (MotionEvent event) {

        switch (event.getAction() & MotionEvent.ACTION_MASK) {
            case MotionEvent.ACTION_DOWN:
                mDownX = (int)event.getX();
                mDownY = (int)event.getY();
                break;
            case MotionEvent.ACTION_MOVE:
...

注意:

  • 方法onInterceptTouchEvent在onTouchEvent之前发生。
  • 此方法拦截所有触摸屏动作事件。这使您可以在将事件发送给您的孩子时进行观察。