2014-04-30 83 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)