note
note copied to clipboard
Android 程序中模拟鼠标点击,滑动,键盘事件
先上代码,具体解释见评论。
/**
* 单击
* @param x
* @param y
*/
public static boolean click(int x, int y) {
String[] events = getClickEvents(200, 3);
return sendEnents(events);
}
/**
* 拖动
* @param x1
* @param y1
* @param x2
* @param y2
*/
public static boolean drag(int x1, int y1, int x2, int y2) {
String[] events = getDragEvents(x1, y1, x2, y2);
return sendEnents(events);
}
/**
* 发送事件
*
* @param events
*/
public static boolean sendEnents(String[] events) {
try {
Process suProcess = Runtime.getRuntime().exec("su");
DataOutputStream os = new DataOutputStream(suProcess.getOutputStream());
for (String event : events) {
os.writeBytes(event + "\n");
os.flush();
}
return true;
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
/**
* 测试
* @return
*/
public static String[] getTest() {
String[] events = new String[3];
events[0] = "input keyevent 82"; // MENU
events[1] = "input keyevent 4"; // Back
events[2] = "input keyevent 3"; // Home
return events;
}
/**
* 拖动步骤
* @param x1
* @param y1
* @param x2
* @param y2
* @return
*/
private static String[] getDragEvents(int x1, int y1, int x2, int y2) {
String[] events = new String[16];
// 第一点
events[0] = "sendevent /dev/input/event1 3 57 0";
events[1] = "sendevent /dev/input/event1 3 53 " + x1;
events[2] = "sendevent /dev/input/event1 3 54 " + y1;
events[3] = "sendevent /dev/input/event1 3 58 31";
events[4] = "sendevent /dev/input/event1 3 50 2";
events[5] = "sendevent /dev/input/event1 0 2 0";
events[6] = "sendevent /dev/input/event1 0 0 0";
// 第二点
events[7] = "sendevent /dev/input/event1 3 57 0";
events[8] = "sendevent /dev/input/event1 3 53 " + x2;
events[9] = "sendevent /dev/input/event1 3 54 " + y2;
events[10] = "sendevent /dev/input/event1 3 58 31";
events[11] = "sendevent /dev/input/event1 3 50 2";
events[12] = "sendevent /dev/input/event1 0 2 0";
events[13] = "sendevent /dev/input/event1 0 0 0";
// 确认
events[14] = "sendevent /dev/input/event1 0 2 0";
events[15] = "sendevent /dev/input/event1 0 0 0";
return events;
}
/**
* 单击步骤
* @param x
* @param y
* @return
*/
private static String[] getClickEvents(int x, int y) {
String[] events = new String[9];
events[0] = "sendevent /dev/input/event1 3 57 0";
events[1] = "sendevent /dev/input/event1 3 53 " + x;
events[2] = "sendevent /dev/input/event1 3 54 " + y;
events[3] = "sendevent /dev/input/event1 3 58 46 ";
events[4] = "sendevent /dev/input/event1 3 50 4";
events[5] = "sendevent /dev/input/event1 0 2 0";
events[6] = "sendevent /dev/input/event1 0 0 0";
events[7] = "sendevent /dev/input/event1 0 2 0";
events[8] = "sendevent /dev/input/event1 0 0 0";
return events;
}
点击滑动模拟原理是对驱动发送消息,就是linux里面的input子系统。
命令格式: sendevent /dev/input/eventX [type] [key] [value]
其中/dev/input/eventX 对应的是设备,可以用getevent查看可用设备,具体的参数可参考:
http://www.netmite.com/android/mydroid/kernel/include/linux/input.h
另外还有 input keyevent/text value,可以产生keyevent或者输入问题,具体的keyevent可以见
http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.2_r1.1/com/android/commands/input/Input.java
以上click是在我的手机上的event,其他手机可能不一样,需要修改events。
不实用!!!不同型号的手机可能不一样!