Android 应用程序,通过 Presentation
类和相关设施,可以在外部显示器(HDMI、MHL、Miracast 等)上显示单独的内容,而不是在手机或平板电脑自己的触摸屏上(我什么'将在这里称为“主显示器”。
对于主显示,我们可以使用screencap
或者DDMS来截屏。
有没有办法做外接显示器的截图?
理想情况下,这将是一种类似于 screencap
/DDMS 的解决方案,无需修改应用程序。但是,涉及以某种方式复制表示外部显示器的 Window
内容的解决方案也很有趣。
最佳答案
没有用于捕获外部显示器的操作系统功能。
主显示器由多个来源合成,外部显示器也是如此。 “截屏”功能实际上只是合成各种来源的另一种方式。因为它使用与主显示器相同的参数,所以您会得到相同的输出。 (请注意,任何“安全”层,例如受 DRM 保护的视频,都不会出现。)因此,要“捕获”外部显示器,您需要一个使用外部显示器“层堆栈”而不是主要的,并且没有这样做的 API。
(参见 SurfaceFlinger.cpp 中的 SurfaceFlinger::captureScreenImplLocked()
。)
screenrecord
命令做类似的事情:它使用主显示器的层堆栈创建一个虚拟显示器,并捕获在那里呈现的任何内容。
就捕获 Presentation
的输出而言,有几个可能感兴趣的 CTS 测试。 VirtualDisplayTest创建一个 Presentation
并使用 ImageReader 捕获它, 而 EncodeVirtualDisplayTest通过完整的视频编码/解码路径提供演示文稿。测试只是绘制一系列颜色,然后检查以确保可以读回这些颜色。这两者都需要最新版本的 Android(例如 ImageReader
直到 API 19 才存在),并且应用的有限权限会将输出限制为应用本身呈现的内容。
关于android - Android 上外接显示器的屏幕截图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26941104/