Android input事件注入

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

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值