У меня есть корневое приложение, которое должно захватывать экран в какой-то момент во время выполнения. Для того, чтобы достичь этого, я взаимодействовать с Android оболочки, используя следующий код:Обеспечение правильной передачи данных из InputStream
private static Process su = Runtime.getRuntime().exec("su");
private static DataOutputStream outputStream = new DataOutputStream(su.getOutputStream());
private static DataInputStream inputStream = new DataInputStream(su.getInputStream());
private void CaptureScreen() {
outputStream.writeBytes("/system/bin/screencap -p\n");
outputStream.flush();
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
//outputStream.writeBytes("echo test\n");
//outputStream.flush();
}
Он прекрасно работает, даже когда я называю это несколько раз, но в тот момент я выполняю фиктивную команду, которая производит вывод оболочки между Вызов CaptureScreen, BitmapFactory.decodeStream не работает. Учитывая это, у меня есть несколько вопросов:
- Я предполагаю, что это происходит потому, что данные в пределах InputStream нет больше чисто не связаны с данными изображения. Поскольку время выполнения одного экземпляра (как указано в here), я снова предполагаю, что другие процессы также могут вводить свои выходы в моем InputStream в живую систему . Как я могу убедиться, что только получить данные, которые мне нужны, из InputStream?
- Почему CaptureScreen работает правильно при вызове несколько раз? Как ли BitmapFactory.decodeStream удается получить последнее изображение из InputStream? Занимает ли он «соответствующие» данные, когда это удается? Делает ли поиск последних данных изображения из InputStream? Если да, то почему он терпит неудачу, когда перед данными изображения в файле InputStream возникают нерелевантные данные?
Я знаю, что могу обойти эту проблему, записав изображение в файл, а затем прочитал его оттуда, но я хотел бы избежать операций ввода-вывода в пользу производительности.