Android 注入Event

来源:互联网 发布:冒充淘宝客服退款诈骗 编辑:程序博客网 时间:2024/06/05 02:32

Android在自动化测试的过程中经常会涉及到注入event的场景,通过参考网上资料大概分为两种:

1. 通过instrumentation注入。

查看instrumentation 的源码会发现,会有很多send开头的方法:
sendxxx 方法

随便选取其中的一个方法:

  public void sendPointerSync(MotionEvent event) {        validateNotAppThread();        if ((event.getSource() & InputDevice.SOURCE_CLASS_POINTER) == 0) {            event.setSource(InputDevice.SOURCE_TOUCHSCREEN);        }        InputManager.getInstance().injectInputEvent(event,                InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH);    }

不难看出其中其实是调用了 InputManager 类来实现事件输入,这里不具体展开,补充一个简单的例子。

  Instrumentation inst = new Instrumentation();  inst.sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);

上面例子输入了一个 KEYCODE_BACK 返回键操作。

2.通过在系统目录下注入。( /dev/input/eventX)

为了说明这种方式,先铺垫下/dev/input/eventX。
手机(必须是root的)连接usb,通过shell命令进到这个目录,然后ls :
这里写图片描述

出现event 开头的几个输入设备的节点。
在命令行输入: adb shell getevent ,随意点击手机观察控制台:

/dev/input/event4: 0003 0039 00000000/dev/input/event4: 0000 0002 00000000/dev/input/event4: 0000 0000 00000000/dev/input/event4: 0003 003a 0000004d/dev/input/event4: 0003 0035 000001ec/dev/input/event4: 0003 0036 000004a9/dev/input/event4: 0003 0039 00000000/dev/input/event4: 0000 0002 00000000/dev/input/event4: 0000 0000 00000000/dev/input/event4: 0003 003a 00000041/dev/input/event4: 0003 0035 00000243/dev/input/event4: 0003 0036 000004b5/dev/input/event4: 0003 0039 00000000/dev/input/event4: 0000 0002 00000000/dev/input/event4: 0000 0000 00000000/dev/input/event4: 0003 003a 00000030/dev/input/event4: 0003 0035 0000028c/dev/input/event4: 0003 0036 000004ca/dev/input/event4: 0003 0039 00000000/dev/input/event4: 0000 0002 00000000/dev/input/event4: 0000 0000 00000000/dev/input/event4: 0000 0002 00000000/dev/input/event4: 0001 014a 00000000/dev/input/event4: 0000 0000 00000000

一直打印当前的输入事件。
与get相对应的,肯定是send ,也就是发送指令:

sendevent <节点路径> <类型><代码> <>
adb shell sendevent /dev/input/event0 1 116 1 #按下电源键adb shell sendevent /dev/input/event0 1 116 0 #抬起电源键

具体效果跟厂商有关,可能不生效。

还有一种输入网上也有相关介绍:

IBinder wmbinder = ServiceManager.getService( "window" ); IWindowManager m_WndManager = IWindowManager.Stub.asInterface( wmbinder)m_WndManager.injectKeyEvent( new KeyEvent( KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_A ),true );// key upm_WndManager.injectKeyEvent( new KeyEvent( KeyEvent.ACTION_UP, KeyEvent.KEYCODE_A ),true );

在实践过程中发现并不可用,IWindowManager 类里面根本就没有injectKeyEvent之类的方法,不知道是不是API版本不同还是什么其他原因。

IWindowManager 源码地址: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.1.1_r1/android/view/IWindowManager.java#IWindowManager

参考文章:
http://www.pocketmagic.net/injecting-events-programatically-on-android/#.VEoIoIuUcaV
https://wizardforcel.gitbooks.io/deepin-android-vol3/content/5.html

原创粉丝点击