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

来源:互联网 发布:云计算 演讲稿 编辑:程序博客网 时间:2024/05/09 23:01

摘要


有的时候我们想要通过自动化来实现调节手机的音量等其他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)
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 1岁的宝宝腹泻怎么办 一岁宝宝老拉肚子怎么办 一岁宝宝拉肚子怎么办啊 小孩发烧怎么办39度要吃消炎药吗 孩子不爱吃水果蔬菜怎么办 一岁宝宝不吃水果怎么办 一岁宝宝不爱吃水果怎么办 1岁多宝宝不吃水果怎么办 中学生不爱与家长交流怎么办 孩子一直37度多怎么办 小孩39度3算高烧怎么办 7岁发烧怎么办如何退烧 7岁反复发烧7天怎么办 一岁发烧39.8度怎么办 反复发烧39度4天怎么办 大人发烧到39度怎么办 小孩高烧39度多怎么办 孩子嗓子发炎发烧怎么办吃什么药 猫咪吃了点桃子怎么办 猫吃了牛油果怎么办 苹果手机死机开不了机怎么办 新生儿出生第一天没奶水怎么办 第一天断奶奶水一直流出怎么办 3岁宝宝不长个子怎么办 5个月宝宝不长个怎么办 孩子比同龄人矮很多怎么办 孕妇做春梦宫缩怎么办 减肥掉头发很厉害怎么办 孕妇吃了金枪鱼罐头怎么办 怀孕吃了烂水果怎么办 快递水果压坏了怎么办 谈对象被骗了钱怎么办 如果遇到半夜坏人敲门怎么办 小孩晚上不进房间睡觉怎么办 房子照不到阳光潮湿怎么办 4个月婴儿不拉屎怎么办 小孩六个月奶不够吃怎么办 到晚上就没奶水怎么办 20多天奶水不够怎么办 四个月奶不够吃怎么办 7个月宝宝不肯吃东西怎么办