2

我正在使用类似的代码

uiDevice.pressKeyCode(KeyEvent.KEYCODE_ENTER);

而且我的应用程序一直在触发两个事件。我可以说,回车键链接到一个服务,并且该服务被调用了两次。

我查看了代码(https://android.googlesource.com/platform/frameworks/testing/+/android-sdk-support_r11/uiautomator/library/src/com/android/uiautomator/core/InteractionController.java)归结为以下代码:

public boolean sendKey(int keyCode, int metaState) {
    ...
    KeyEvent downEvent = KeyEvent.obtain(eventTime, eventTime, KeyEvent.ACTION_DOWN,
            keyCode, 0, metaState, KeyCharacterMap.VIRTUAL_KEYBOARD, 0, 0,
            InputDevice.SOURCE_KEYBOARD, null);
    if (injectEventSync(downEvent)) {
        KeyEvent upEvent = KeyEvent.obtain(eventTime, eventTime, KeyEvent.ACTION_UP,
                keyCode, 0, metaState, KeyCharacterMap.VIRTUAL_KEYBOARD, 0, 0,
                InputDevice.SOURCE_KEYBOARD, null);
        if(injectEventSync(upEvent)) {
            return true;
        }
    }
    return false;
}

从表面上看,这意味着我的 KeyEvent.KEYCODE_ENTER 键码被发送到设备两次,一次用于 action_up,一次用于 action_down。

有谁知道解决这个问题的方法,遇到过类似的问题,可以确认我上面的逻辑是正确的吗?

4

1 回答 1

1

由于我对您的应用程序知之甚少,因此我将建议一些我已经使用或考虑使用的解决方法来修复未明确的 UiAutomator 结果:

  1. 不要使用presskeycode,而是单击屏幕上的按钮-如果软键盘启动,您可以单击输入键的坐标-这不是一种干净的方法,但它是一种稳定的解决方法。

  2. 更改您的服务以忽略任何过于接近的请求。例如,如果您在 200 毫秒甚至 1 秒内收到两个请求,则只需接受第一个。

于 2014-03-13T20:34:04.680 回答