【问题标题】:Screen capture of external display on Android?Android上外部显示器的屏幕截图?
【发布时间】:2014-11-15 00:31:47
【问题描述】:

Android 应用程序,通过Presentation 类和相关设施,可以在外部显示器(HDMI、MHL、Miracast 等)上显示单独的内容,而不是在手机或平板电脑自己的触摸屏上(我称之为“主显示器”)。

对于主屏,我们可以使用screencap或者DDMS做截图。

有没有办法给外接显示器做截图?

理想情况下,这将是一个类似于screencap/DDMS 的解决方案,无需修改应用程序。但是,涉及以某种方式复制代表外部显示器的Window 的内容的解决方案也会很有趣。

【问题讨论】:

    标签: android android-sdk-tools


    【解决方案1】:

    没有用于捕获外部显示器的操作系统功能。

    主显示屏由多个来源合成,外部显示屏也是如此。 “截屏”功能实际上只是合成各种来源的另一种方式。因为它使用与主显示相同的参数,所以您得到相同的输出。 (请注意,不会出现任何“安全”层,例如受 DRM 保护的视频。)因此,要“捕获”外部显示器,您需要使用外部显示器“层堆栈”而不是使用外部显示器“层堆栈”的屏幕捕获变体主要的,并且没有用于这样做的 API。

    (参见SurfaceFlinger.cpp 中的SurfaceFlinger::captureScreenImplLocked()。)

    screenrecord 命令做了类似的事情:它使用主显示器的层堆栈创建一个虚拟显示器,并捕获在那里渲染的任何内容。

    就捕获Presentation 的输出而言,有几个可能感兴趣的CTS 测试。 VirtualDisplayTest 创建一个Presentation 并使用ImageReader 捕获它,而EncodeVirtualDisplayTest 通过完整的视频编码/解码路径提供演示文稿。测试只是绘制一系列颜色,然后检查以确保可以读回颜色。这两者都需要最新版本的 Android(例如,ImageReader 直到 API 19 才存在),并且应用程序的有限权限会将输出限制为应用程序本身正在呈现的内容。

    【讨论】:

    • 你是怎么知道这一切的:O
    • 我有点想是这种情况,但我不确定我是否错过了其他选择。我将为screencap 和/或screenrecord 提交功能请求,以获取从外部显示器捕获的命令行开关,这可能会推动添加缺少的API。 CTS 测试的问题在于它们将Presentation 输出单独路由到虚拟显示器,而应用程序驱动的屏幕捕获机制需要将Presentation 路由到真实的外部显示器我们可以对其进行屏幕截图。
    • @rupps:如果 fadden 写了我们在这里讨论的一些内容,我不会感到震惊... :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-23
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多