在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


3166

被折叠的 条评论
为什么被折叠?



