執行 adb shell getevent -p 列出輸入裝置事件碼,預期應包含 0036 (ABS_MT_POSITION_X) 等多點觸控相關碼,但輸出中缺失。
程式碼使用 readline() 逐行讀取 getevent 輸出,但 getevent -p 的輸出可能包含不換行的連續資料流或單行過長,導致 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,可能原因:getevent。adb shell getevent -p | grep 0036
# 或直接在 shell 中執行
adb shell
getevent -p
改用 read() 完整讀取輸出流,通常能解決程式碼解析遺漏事件碼的問題。