appium 源码分析(十二)-pressKeyCode,LongPressKeyCode

摘要

有的时候我们想要通过自动化来实现调节手机的音量等其他api未提供的一些方法时候,你就需要通过PressKeyCode以及LongPressKeyCode进行实现了

正文

我们首先先来看下PressKeyCode的源代码吧

public AndroidCommandResult execute(final AndroidCommand command)
      throws JSONException {
    try {
      final Hashtable<String, Object> params = command.params();
      Object kc = params.get("keycode");
      if (kc instanceof Integer) {
        keyCode = (Integer) kc;
      } else if (kc instanceof String) {
        keyCode = Integer.parseInt((String) kc);
      } else {
        throw new IllegalArgumentException("Keycode of type " + kc.getClass() + "not supported.");
      }

      if (params.get("metastate") != JSONObject.NULL) {
        metaState = (Integer) params.get("metastate");
        UiDevice.getInstance().pressKeyCode(keyCode, metaState);
      } else {
        UiDevice.getInstance().pressKeyCode(keyCode);
      }

      return getSuccessResult(true);
    } catch (final Exception e) {
      return getErrorResult(e.getMessage());
    }
  }

以上的代码主要及时获取到KeyCode的值以及metastate的值。这里的metastate实际上就是控制按键,比如说shift键,alt键,ctrl键等控制键,获取到两个值以后还是调用的Device实例对象的pressKeyCode方法。
我们还是来一个例子来说明下吧。

self.driver.press_keycode(26)

直接这样子 这里的keycode的话可以通过

Android KeyCode
进行查看,这里的26是power键

下来我们再来看看LongPressKeyCode,因为UiAutomator没有实现相应的API方法,所以只能通过反射的方式调用其中的方法了。 我们来看看LongPressKeyCode

public AndroidCommandResult execute(final AndroidCommand command)
      throws JSONException
       {
    try {
      InteractionController interactionController = UiAutomatorBridge.getInstance().getInteractionController();

      final Hashtable<String, Object> params = command.params();
      keyCode = (Integer) params.get("keycode");
      metaState = params.get("metastate") != JSONObject.NULL ? (Integer) params
          .get("metastate") : 0;
      final long eventTime = SystemClock.uptimeMillis();
      // Send an initial down event
      final KeyEvent downEvent = new KeyEvent(eventTime, eventTime,
          KeyEvent.ACTION_DOWN, keyCode, 0, metaState,
          KeyCharacterMap.VIRTUAL_KEYBOARD, 0, 0, InputDevice.SOURCE_KEYBOARD);
      if (interactionController.injectEventSync(downEvent)) {
        // Send a repeat event. This will cause the FLAG_LONG_PRESS to be set.
        final KeyEvent repeatEvent = KeyEvent.changeTimeRepeat(downEvent,
            eventTime, 1);
        interactionController.injectEventSync(repeatEvent);
        // Finally, send the up event
        final KeyEvent upEvent = new KeyEvent(eventTime, eventTime,
            KeyEvent.ACTION_UP, keyCode, 0, metaState,
            KeyCharacterMap.VIRTUAL_KEYBOARD, 0, 0, InputDevice.SOURCE_KEYBOARD);
        interactionController.injectEventSync(upEvent);
      }
      return getSuccessResult(true);
    } catch (final Exception e) {
      return getErrorResult(e.getMessage());
    }
  }

前面已经说过了,由于UiAutomator没有实现longPressKeyCode的Api,所以这里的实现需要用到反射的方式,并且它实现了KeyEvent时间,让其重复keyDown一段时间后,再发送keyUp时间。
同样的例子长按power键

self.driver.long_press_keycode(26)
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值