Android中可以采用input命令来进行事件注入,如input tap 100 200
input的代码在
frameworks/base/cmds/input/src/com/android/commands/input/Input.java
调用的是
298 private void injectMotionEvent(int inputSource, int action, long when, float x, float y, float pressure) { 299 final float DEFAULT_SIZE = 1.0f; 300 final int DEFAULT_META_STATE = 0; 301 final float DEFAULT_PRECISION_X = 1.0f; 302 final float DEFAULT_PRECISION_Y = 1.0f; 303 final int DEFAULT_EDGE_FLAGS = 0; 304 MotionEvent event = MotionEvent.obtain(when, when, action, x, y, pressure, DEFAULT_SIZE, 305 DEFAULT_META_STATE, DEFAULT_PRECISION_X, DEFAULT_PRECISION_Y, 306 getInputDeviceId(inputSource), DEFAULT_EDGE_FLAGS); 307 event.setSource(inputSource); 308 Log.i(TAG, "injectMotionEvent: " + event); 309 InputManager.getInstance().injectInputEvent(event, 310 InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH); 311 }
InputManager.getInstance().injectInputEvent 调用到InputDispatcher的
injectInputEvent方法
monkey test中的点击等操作就是调用的这些方法,
但是直接调用这样的方法在复杂的场景下有问题,当屏幕上已经有一个触碰时,再发送一个这样的inject事件,会导致原来的触碰被取消,在input的tap方法中,把down和up事件中增加一个sleep,会发现,是在up事件注入后出现原触碰点被取消,
一个疑问。
而使用 sendevent可以避免这样的问题,但sendevent的数据格式有些复杂,这是一个方案。
一个达人写的通过getevent, sendevent类似的方法去录制屏幕的处理
https://github.com/TUSSON/android-event-recorder