2014-04-30 45 views
0

我想模拟我的Android设备中使用getevent/sendevent机制的按键。我看到一个正在工作的批处理文件。所以我知道adb shell sendevent机制起作用。亚行外壳sendevents不工作

所以我做亚行外壳Getvent并做了一些按键,这让我看起来像以下事件:

/

dev/input/event0 0003 0039 0000006c 
/dev/input/event0 0001 014a 00000001 
/dev/input/event0 0001 0145 00000001 
/dev/input/event0 0003 0035 000003f8 
/dev/input/event0 0003 0036 00000153 
/dev/input/event0 0003 0030 00000001 
/dev/input/event0 0003 0031 00000000 
/dev/input/event0 0000 0000 00000000 
/dev/input/event0 0001 014a 00000000 
/dev/input/event0 0001 0145 00000000 
/dev/input/event0 0000 0000 00000000 
/dev/input/event0 0003 0039 0000006d 
/dev/input/event0 0001 014a 00000001 
/dev/input/event0 0001 0145 00000001 
/dev/input/event0 0003 0035 00000278 
/dev/input/event0 0003 0036 0000022c 
/dev/input/event0 0003 0030 00000004 
/dev/input/event0 0003 0031 00000004 
/dev/input/event0 0000 0000 00000000 
/dev/input/event0 0003 0039 ffffffff 
/dev/input/event0 0001 014a 00000000 
/dev/input/event0 0001 0145 00000000 
/dev/input/event0 0000 0000 00000000 

所以我复制了同样的事件,并提出从看起来批处理文件如下:

adb shell sendevent /dev/input/event0 0003 0039 0000006c 
adb shell sendevent /dev/input/event0 0001 014a 00000001 
adb shell sendevent /dev/input/event0 0001 0145 00000001 
adb shell sendevent /dev/input/event0 0003 0035 000003f8 
adb shell sendevent /dev/input/event0 0003 0036 00000153 
adb shell sendevent /dev/input/event0 0003 0030 00000001 
adb shell sendevent /dev/input/event0 0003 0031 00000000 
adb shell sendevent /dev/input/event0 0000 0000 00000000 
adb shell sendevent /dev/input/event0 0003 0039 ffffffff 
adb shell sendevent /dev/input/event0 0001 014a 00000000 
adb shell sendevent /dev/input/event0 0001 0145 00000000 
adb shell sendevent /dev/input/event0 0000 0000 00000000 
adb shell sendevent /dev/input/event0 0003 0039 0000006d 
adb shell sendevent /dev/input/event0 0001 014a 00000001 
adb shell sendevent /dev/input/event0 0001 0145 00000001 
adb shell sendevent /dev/input/event0 0003 0035 00000278 
adb shell sendevent /dev/input/event0 0003 0036 0000022c 
adb shell sendevent /dev/input/event0 0003 0030 00000004 
adb shell sendevent /dev/input/event0 0003 0031 00000004 
adb shell sendevent /dev/input/event0 0000 0000 00000000 
adb shell sendevent /dev/input/event0 0003 0039 ffffffff 
adb shell sendevent /dev/input/event0 0001 014a 00000000 
adb shell sendevent /dev/input/event0 0001 0145 00000000 
adb shell sendevent /dev/input/event0 0000 0000 00000000 

但是,当我运行这个批处理文件,事件不是模拟。有什么我在这里失踪?

+1

打开一个单独的亚行会议,并运行,而你试试你的批处理文件 –

+0

它不显示任何事件getevent在。令人惊讶的是,我的批处理文件没有显示错误。不过,我只是发现了十六进制的getevent结果,而SendEvent只取十进制。这是否意味着我必须手动翻译所有事件? – TeaLeave

+1

可能 - 我还记得类似的约束,虽然你可以检查工具的来源是肯定的。用一个小小的自定义程序不应该太难...... *即使电子表格*有时可以成为一次性数据转换项目的便捷工具。 –

回答

1

我从来没有想过是这样,谢谢你的建议。 它现在实际上工作,因为我只是在一个字符串中打印十六进制值的问题之前使用脚本和python会做转换。请注意,该系统比输入分路器版本快得多。我可以将触摸事件以0.3秒左右的交错发回(我仍然不明白为什么它无法处理更快的序列)

这就是我在运行Android 6.1的Nexus 5上在python上做的:在不同的窗口

import os 

EV_ABS    = 0x0003 
EV_SYN    = 0x0000 
ABS_MT_POSITION_X = 0x0035 
ABS_MT_POSITION_Y = 0x0036 
ABS_MT_PRESSURE = 0x003a 
ABS_MT_TOUCH_MAJOR = 0x0030 
SYN_REPORT   = 0x0000 
ABS_MT_TRACKING_ID = 0x0039 

touch_event_id = 1 

def touch(x, y): 

    global touch_event_id 

    event_string = "sendevent /dev/input/event1 %d %d %d\n" % (EV_ABS, ABS_MT_TRACKING_ID, touch_event_id) 
    event_string += "sendevent /dev/input/event1 %d %d %d\n" % (EV_ABS, ABS_MT_POSITION_X, x) 
    event_string += "sendevent /dev/input/event1 %d %d %d\n" % (EV_ABS, ABS_MT_POSITION_Y, y) 
    event_string += "sendevent /dev/input/event1 %d %d %d\n" % (EV_ABS, ABS_MT_PRESSURE, 5) 
    event_string += "sendevent /dev/input/event1 %d %d %d\n" % (EV_ABS, ABS_MT_TOUCH_MAJOR, 5) 
    event_string += "sendevent /dev/input/event1 %d %d %d\n" % (EV_SYN, SYN_REPORT,   0) 

    event_string += "sendevent /dev/input/event1 %d %d %d\n" % (EV_ABS, ABS_MT_TRACKING_ID, -1) 
    event_string += "sendevent /dev/input/event1 %d %d %d\n" % (EV_SYN, SYN_REPORT,   0) 

    touch_event_id+=1 

    os.system('adb shell "%s" &' % event_string)