Захват экрана внешнего дисплея на Android?

Приложения Android через класс Presentation и связанные с ним объекты могут отображать отдельный контент на внешнем дисплее (HDMI, MHL, Miracast и т. Д.), Чем на сенсорном экране телефона или планшета (здесь я буду называть «основной дисплей») ,

Для основного дисплея мы можем использовать screencap или DDMS, чтобы сделать снимок экрана.

Есть ли способ сделать снимок экрана на внешнем дисплее?

В идеале это было бы решение, которое можно было бы использовать с помощью screencap / DDMS без изменений в приложении. Тем не менее, интересны также решения, которые каким-то образом копируют содержимое Window представляющего внешний дисплей.

Нет функции ОС для захвата внешнего дисплея.

Основной дисплей состоит из нескольких источников, а также внешнего дисплея. Функция «захвата экрана» на самом деле является еще одним способом объединения различных источников. Поскольку он использует те же параметры, что и основной дисплей, вы получаете тот же результат. (Обратите внимание, что любые «защищенные» слои, такие как видео с защитой DRM, не отображаются.) Чтобы «захватить» внешний дисплей, вам нужен вариант захвата экрана, который использует внешний слой «стек стека», а не Основной, и для этого нет API.

(См. SurfaceFlinger::captureScreenImplLocked() в SurfaceFlinger.cpp .)

Команда screenrecord делает что-то подобное: она создает виртуальный дисплей с стеком уровня основного дисплея и фиксирует все, что там отображается.

Что касается вывода результатов Presentation , есть несколько тестов CTS, которые могут представлять интерес. VirtualDisplayTest создает Presentation и фиксирует ее с помощью ImageReader , а EncodeVirtualDisplayTest передает презентацию через полный путь кодирования / декодирования видео. Тесты просто рисуют серию цветов, а затем проверяют, чтобы цвета можно было прочитать. Для обоих из них требуются последние версии Android (например, ImageReader не существовало до API 19), а ограниченные разрешения приложения ограничивают вывод тем, что само приложение выполняет рендеринг.