Andorid Input事件 注入方法及原理介绍

在Android系统中,除了真实的输入设备可以产生事件之外,我们也可以通过软件的方式,模拟一个输入事件,比如模拟一个点击事件,模拟一个按键事件等等。

怎么模拟一个输入事件
1,在adb命令行使用input命令模拟输入事件
源码路径:frameworks\base\cmds\input\src\com\android\commands\input\Input.java

@Override
    public void onShowUsage(PrintStream out) {
   
   
        out.println("Usage: input [<source>] [-d DISPLAY_ID] <command> [<arg>...]");
        out.println();
        out.println("The sources are: ");
        for (String src : SOURCES.keySet()) {
   
   
            out.println("      " + src);
        }
        out.println();
        out.printf("-d: specify the display ID.\n"
                + "      (Default: %d for key event, %d for motion event if not specified.)",
                INVALID_DISPLAY, DEFAULT_DISPLAY);
        out.println();
        out.println("The commands and default sources are:");
        out.println("      text <string> (Default: touchscreen)");
        out.println("      keyevent [--longpress] <key code number or name> ..."
                + " (Default: keyboard)");
        out.println("      tap <x> <y> (Default: touchscreen)");
        out.println("      swipe <x1> <y1> <x2> <y2> [duration(ms)]"
                + " (Default: touchscreen)");
        out.println("      draganddrop <x1> <y1> <x2> <y2> [duration(ms)]"
                + " (Default: touchscreen)");
        out.println("      press (Default: trackball)");
        out.println("      roll <dx> <dy> (Default: trackball)");
        out.println("      motionevent <DOWN|UP|MOVE> <x> <y> (Default: touchscreen)");
    }

从使用方法说明中可以看出,使用input keyevent 可以模拟一个按键事件,使用input tap 可以模拟一个点击事件。他们都是通过调用IMS的injectInputEvent方法向系统注入事件,只是传入的event类型不一致

InputManager.getInstance().injectInputEvent(event,InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH);

2,在代码中模拟输入事件

对于使用系统源码编译的APK,当然可以直接调用IMS的injectInputEvent来模拟一个输入事件。
如果APP不是放在系统源码中编译,直接使用这个方法的话,肯定是编译不过的,这时候我们可以借助Instrumentation类来实现模拟一个输入事件,例如注入一个MotionEvent 的down事件

Instrumentation instrumentation = new Instrumentation();
MotionEvent event = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值