2015-05-07 2 views
2

Пакет Media Projection - это новый Lollipop и позволяет приложению захватывать экран устройства в реальном времени для потоковой передачи на видео. Я надеялся, что это также можно использовать для захвата одного скриншота, но до сих пор я не был успешным. Конечно, первый кадр захваченного видео может работать, но я нацелен на идеальный, без потерь скриншот, соответствующий пиксельному разрешению устройства. По-прежнему из захваченного видео не может этого гарантировать.Как сделать снимок экрана программно с Lollipop

Я пробовал много вещей, но ближе всего я пришел к решению, чтобы сначала запустить invisible activity. Затем эта активность следует за API example для начала захвата экрана, который может включать в себя запрос пользователя. После включения захвата экрана изображение в реальном времени отображается в SurfaceView. Однако я не могу найти способ захватить растровое изображение из SurfaceView. Есть много questions и discussions об этом, но никакие решения не работают, и есть некоторые доказательства того, что это impossible.

Любые идеи?

+0

был бы скриншот приложения - минус в строке состояния достаточно хорошо? –

+0

@BojanKseneman Да, но имейте в виду, что это должно быть способно скриншоты что-либо на устройстве (за исключением защищенных поверхностей) - не только мое приложение. – pents90

+1

Вы видели https://github.com/mtsahakis/MediaProjectionDemo/blob/master/src/com/mtsahakis/mediaprojectiondemo/ScreenCaptureImageActivity.java? – shkschneider

ответ

3

Вы не можете захватить содержимое SurfaceView.

Что вы можете сделать, это заменить SurfaceView объектом Surface, который имеет встроенного пользователя, например SurfaceTexture. В примере андроида-ScreenCapture, связанного с вопросом, mMediaProjection.createVirtualDisplay() хочет, чтобы поверхность отправляла изображения. Если вы создаете SurfaceTexture и используете это значение construct a Surface, изображения, созданные MediaProjection, будут доступны из текстуры OpenGL ES.

Если GLES - это не ваша вещь, то можно использовать класс ImageReader. Он также предоставляет поверхность, которая может быть передана в createVirtualDisplay(), но легче получить доступ к пикселям от программного обеспечения.

Смежные вопросы