Yhzhtk / note

知识代码笔记
https://github.com/Yhzhtk/note/issues
MIT License
108 stars 11 forks source link

Android 程序中模拟鼠标点击,滑动,键盘事件 #3

Open Yhzhtk opened 11 years ago

Yhzhtk commented 11 years ago

先上代码,具体解释见评论。

/**
 * 单击
 * @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;
}
Yhzhtk commented 11 years ago

点击滑动模拟原理是对驱动发送消息,就是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。

dezhihuang commented 7 years ago

不实用!!!不同型号的手机可能不一样!