Android 注入Event

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

1. 通过instrumentation注入。

查看instrumentation 的源码会发现,会有很多send开头的方法:
Android 注入Event_第1张图片

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

  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 :
Android 注入Event_第2张图片

出现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 up
m_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

你可能感兴趣的:(基础部分)