【问题标题】:How to capture a screenshot programmatically with Lollipop如何使用 Lollipop 以编程方式捕获屏幕截图
【发布时间】:2015-05-07 16:06:20
【问题描述】:

Media Projection 包是新的 Lollipop,它允许应用程序实时捕获设备的屏幕以流式传输到视频。我希望这也可以用来捕获单个静止屏幕截图,但到目前为止我还没有成功。当然,捕获的视频的第一帧可以工作,但我的目标是获得与设备像素分辨率相匹配的完美、无损截图。捕获的视频中的静止图像无法提供这一点。

我尝试了很多方法,但最接近解决方案的是首先启动invisible activity。然后此活动遵循API example 开始屏幕捕获,其中可能包括询问用户的许可。启用屏幕捕获后,屏幕图像将实时显示在 SurfaceView 中。但是,我找不到从 SurfaceView 捕获位图的方法。关于这个有很多questionsdiscussions,但似乎没有解决方案有效,并且有一些证据表明它是impossible

有什么想法吗?

【问题讨论】:

  • 应用截图-减去状态栏就够了吗?
  • @BojanKseneman 是的,但请记住,这应该能够截取设备上的任何内容(安全表面除外)——不仅仅是我的应用程序。
  • 哦,我不确定你是否可以在没有 root 的情况下捕获其他应用程序。那将是一个安全问题。你可以用反射做一些技巧来调用隐藏的android代码,它有截图功能
  • @BojanKseneman 你绝对可以在 Lollipop 中,它只是先询问用户权限。请参阅上面链接的 API 演示。

标签: android android-mediaprojection


【解决方案1】:

您无法捕获 SurfaceView 的内容。

您可以将 SurfaceView 替换为具有进程内使用者的 Surface 对象,例如 SurfaceTexture。在从问题链接的 android-ScreenCapture 示例中,mMediaProjection.createVirtualDisplay() 想要一个 Surface 来发送图像。如果您创建 SurfaceTexture 并将其用于construct a Surface,则 MediaProjection 生成的图像将从 OpenGL ES 纹理中获得。

如果您不喜欢 GLES,则可以使用 ImageReader 类。它还提供了一个可以传递给createVirtualDisplay() 的 Surface,但更容易从软件中访问像素。

【讨论】:

    猜你喜欢
    • 2023-03-05
    • 1970-01-01
    • 2014-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    • 2017-11-15
    相关资源
    最近更新 更多