Снимок экрана написан неправильно с помощью команды оболочки «screencap -p» в Android-устройстве Xamarin - PullRequest
0 голосов
/ 11 июня 2019

Я хочу программно сделать снимок экрана моего приложения и по определенным причинам (используя OpenGl SurfaceView, чтобы назвать его) я не хочу использовать обычно именованные методы, такие как использование кэша рисования видов.Я протестировал команду оболочки screencap -p , используя adb, и она отлично работала.Но если я выполню команду из моего приложения Xamarin для Android, используя следующий код:

Java.Lang.Process process;
process = Java.Lang.Runtime.GetRuntime().Exec("screencap -p /sdcard/test.png");
process.WaitFor();

, файл test.png будет создан, но размером всего 12B, и, очевидно, не отображает изображение (только серое с кружком!знак).У меня нет рутированного устройства (Samsung Galaxy Tab S3 btw), но так как команда работает через оболочку adb без и su или root, я бы подумал, что оно также может работать из приложения.

Так что мойвопросы: возможно ли сделать снимок экрана с помощью команды оболочки «screencap -p» из приложения на устройстве, которое не имеет рута?Если ответ «да», почему я сталкиваюсь с поврежденными файлами изображений?Каковы возможные причины этого и как избежать этого поведения?

Ответы [ 2 ]

0 голосов
/ 14 июня 2019

Я смотрел журнал устройства через adb logcat, когда снимал скриншот. Кажется, проблема в том, что вам нужно разрешение Android "READ_FRAME_BUFFER". Но это разрешение доступно только для системных приложений. Итак, в заключение я бы сказал, что это просто невозможно в моих обстоятельствах, когда у меня нет рутованного устройства. При использовании рутованного устройства подход su, вероятно, сработает.

0 голосов
/ 11 июня 2019

Иногда вам необходимо полностью определить screencap, поэтому я считаю, что вы можете просто сделать следующее:

Java.Lang.Process process;
process = Java.Lang.Runtime.GetRuntime().Exec("/system/bin/screencap -p /sdcard/test.png");
process.WaitFor();

Я основываю это на примере класса java, который доступен для просмотра на GitHub здесь.Очевидно, просто конвертируйте из Java в Xamarin, где это уместно.

Интересно, что похоже, что они пытаются получить привилегии sudo, если он не может написать с первой попытки, используя:

process = Runtime.getRuntime().exec("su");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...