Android InputStream of Process проглатывает последние байты - PullRequest
0 голосов
/ 30 января 2012

У меня рутованный телефон 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, но не смог найти решение.

...