2018年12月23日 星期日

20-getevent

getevent 是一個和模擬輸入無直接相關的指令,但若看官想知道當滑動 Android 觸控面板時是由那些輸入事件所構成,或想記錄點擊、滑動等動作以回放這些操作,那 getevent 將是一種選擇。

本喵只列出自己常用的參數,其餘的請看官依需要自行查閱:
語法 getevent [-t] [-p] [-l] [device]
說明 -t: 顯示輸入事件的時間戳記。
-l: 以文字標記輸入事件的 event type 和 event name(否則會以 16 進位來顯示)。
-p: 列出有哪些輸入設備及其支援的輸入事件。可與 -l 搭配以標記 event name。
device: 輸入設備代號,如 /dev/input/event0
-h: 列出 getevent 的使用方法。其實只要是不合法的參數都會顯示,-h 本身就不是合法的參數。

咱們來看看怎麼得知觸控面板的輸入設備代號,以 Nexus 5 (Android 8.1.0) 為例,輸出類似如下:
C:\Users\tester>adb shell getevent -lp
add device 4: /dev/input/event1
  name: "touch_dev"
  events:
    ABS (0003): ABS_MT_SLOT       : value 0, min 0, max 9, fuzz 0, flat 0, resolution 0
                ABS_MT_TOUCH_MAJOR: value 0, min 0, max 15, fuzz 0, flat 0, resolution 0
                ABS_MT_POSITION_X : value 0, min 0, max 1079, fuzz 0, flat 0, resolution 0
因咱們可以發現 /dev/input/event1 支援 ABS_MT_POSITION_X(MT 表示一個多點觸控的 X 軸事件),且其名稱又剛好為 touch_dev,所以可以假設 /dev/input/event1 便是觸控面板的輸入設備代號。

但有些 Android 裝置的多個輸入設備都同時支援 ABS_MT_POSITION_X 事件,而其名稱卻都不具備 touch 字樣,這時咱們可以輸入指令後再實際滑動面板來觀察這些輸入事件:
C:\Users\tester>adb shell getevent -l
/dev/input/event1: EV_ABS ABS_MT_TRACKING_ID 0000001f
/dev/input/event1: EV_ABS ABS_MT_POSITION_X  00000161
/dev/input/event1: EV_ABS ABS_MT_POSITION_Y  00000532
如此便可確認 /dev/input/event1 確實為觸控螢幕的輸入設備代號了。

其實本喵原以為利用 getevent 便可萬無一失的記錄所有觸控或實體按鍵的事件,但不幸的是本喵工作所拿到的 Nexus 5 卻狠狠打臉了本喵!!是的!它不能顯示實體按鍵的事件!也不能顯示單純的點擊事件!而且資訊不能即時印出!有時只能印出部分資訊!所以本喵才會在上面的例子說用滑動來確認觸控螢幕的輸入設備代號。。。到底是本喵的貓品太差呢?還是因為這台 Nexus 5 沒有 root 的關係呢?唉~喵喵喵~~

沒有留言:

張貼留言