首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Android adb shell getevent -p 缺少 0036 事件碼的解決

     編輯:程式設計疑難解答

問題現象

執行 adb shell getevent -p 列出輸入裝置事件碼,預期應包含 0036 (ABS_MT_POSITION_X) 等多點觸控相關碼,但輸出中缺失。

根本原因

程式碼使用 readline() 逐行讀取 getevent 輸出,但 getevent -p 的輸出可能包含不換行的連續資料流或單行過長,導致 readline() 截斷或遺漏。

解決方案:使用 read() 而非 readline()

// Java 範例
Process p = Runtime.getRuntime().exec("getevent -p");
InputStream is = p.getInputStream();
byte[] buffer = new byte[4096];
int len;
StringBuilder output = new StringBuilder();
while ((len = is.read(buffer)) != -1) {
    output.append(new String(buffer, 0, len, "UTF-8"));
}
String result = output.toString();
// 解析 result 尋找 0036

read() 以位元組塊讀取,不依賴換行符,可完整獲取所有輸出。

補充說明

  • 0036 (ABS_MT_POSITION_X) 與 0035 (ABS_MT_POSITION_Y) 屬於多點觸控協議 (MT Protocol B),裝置驅動程式必須支援並註冊。
  • 若 read() 後仍無 0036,可能原因:
    1. 裝置不支援多點觸控或驅動未暴露 MT 事件。
    2. 核心版本較舊,使用舊協議 (Protocol A: ABS_MT_TOUCH_MAJOR 等)。
    3. 權限不足,需 root 權限執行 getevent。

驗證指令

adb shell getevent -p | grep 0036
# 或直接在 shell 中執行
adb shell
getevent -p

改用 read() 完整讀取輸出流,通常能解決程式碼解析遺漏事件碼的問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved