我有一个扎根的Android 4.0手机,需要收听系统范围的触控事件。执行 getevent -t -l / dev / input / event1 在终端的adb shell中产生以下单击结果,我将其解析为向下,移动和向上事件:
51443-343322:EV_ABS ABS_MT_TRACKING_ID 000001f2
51443-343322:EV_ABS ABS_MT_TOUCH_MAJOR 0000000d
51443-343352:EV_ABS ABS_MT_PRESSURE 00000073
51443-343352:EV_ABS ABS_MT_POSITION_X 00000077
51443-343352:EV_ABS ABS_MT_POSITION_Y 000001b6
51443-343383:EV_SYN SYN_REPORT 00000000
51443-453887:EV_ABS ABS_MT_TOUCH_MAJOR 0000000e
51443-453887:EV_ABS ABS_MT_PRESSURE 0000005a
51443-453918:EV_ABS ABS_MT_POSITION_X 00000076
51443-453918:EV_ABS ABS_MT_POSITION_Y 000001b4
51443-453918:EV_SYN SYN_REPORT 00000000
51443-462462:EV_ABS ABS_MT_TRACKING_ID ffffffff
51443-462462:EV_SYN SYN_REPORT 00000000
(粗体是补漆事件)
然而,当我想从Android服务中使用时
new Thread(new Runnable() {
@Override
public void run() {
Process sh = Runtime.getRuntime().exec(new String[] {"su", "-c", "getevent -t -l /dev/input/event1"});
BufferedReader r = new BufferedReader(new InputStreamReader(sh.getInputStream()));
String line;
while(shouldrun) {
while ((line = r.readLine())!=null) {
handleLinuxEvent(line);
}
Thread.yield();
}
r.close();
sh.destroy();
}
}).start();
最后~150个字节似乎总是迷路(包括重要的补漆事件)。输出例如是
51443-343322:EV_ABS ABS_MT_TRACKING_ID 000001f2
51443-343322:EV_ABS ABS_MT_TOUCH_MAJOR 0000000d
51443-343352:EV_ABS ABS_MT_PRESSURE 00000073
51443-343352:EV_ABS ABS_MT_POSITION_X 00000077
51443-343352:EV_ABS ABS_MT_POSITION_Y 000001b6
51443-343383:EV_SYN SYN_REPORT 00000000
51443-453887:EV_ABS ABS_MT_TOUCH_MAJOR 0000000e
51443-453887:EV_ABS ABS_MT_PRESSURE 0000005a
51443-453918:EV_ABS ABS_MT_POSITION_X 00000076
51443-453918:EV_ABS ABS_MT_POSITION_Y 000001b4
51443-453918:EV_SYN SYN_REPORT 000
知道为什么吗?我已经尝试过缓冲/非缓冲流和不同的缓冲区大小。我还阅读了有关Android冻结套接字InputStreams的其他已知问题,但找不到解决方案。