У меня рутованный телефон Android 4.0, и мне нужно слушать общесистемные сенсорные события.Выполнение getevent -t -l / dev / input / event1 в оболочке adb в терминале дает следующие результаты для одного клика, который я анализирую по событиям down, move и up:
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
5144_3_03_03B
51443-453918: EV_SYN SYN_REPORT 00000000
51443-462462: EV_ABS ABS_MT_TRACKING_ID ffffffff
51443-462462: EV_SYN SYN_REPORT 00000000
222событие)
Однако , когда я хочу сделать это с Android Sпри использовании
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_RUS_03_0000
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-453918: EV_ABS ABS_MT_POSITION_Y 000001b4
51443-453918: EV_SYN SYN_REPORT 000
Есть идеи, почему?Я уже пробовал с буферизованными / небуферизованными потоками и различными размерами буфера.Я также читал о других известных проблемах с сокетом InputStreams на зависании Android, но не смог найти решение.