You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过ADB截取Android模拟器虚拟显示屏的截图?

Android模拟器虚拟显示屏ADB截图失败的解决办法

问题说明

在Android模拟器中添加虚拟显示屏(通过「三个点」→「Displays」→「Add secondary display」创建)后,使用adb shell screencap -d <display_id>命令无法截取虚拟屏内容,返回空PNG文件且报错error code 1;实体设备的外接显示屏(type EXTERNAL)则可正常截图。

核心原因

模拟器的虚拟屏属于type VIRTUAL,未绑定到SurfaceFlinger的硬件合成器(HWC),而screencap命令依赖HWC提供的帧缓冲区,因此无法捕获虚拟屏画面。实体设备的外接屏会被HWC正常识别,所以截图功能正常。

可行解决方法

方法1:用MediaProjection API实现截图

编写轻量Android应用,借助MediaProjection API捕获虚拟屏内容:

  • 申请MEDIA_PROJECTION权限
  • 通过MediaManager.getMediaProjection()获取对应虚拟屏的投影实例
  • 创建虚拟显示器并捕获帧数据,保存为图片文件

方法2:模拟器UI直接截图

若无需命令行自动化,可通过模拟器UI操作:

  • 打开模拟器「三个点」菜单 → 「Displays」
  • 选中目标虚拟屏,点击菜单中的「Screenshot」按钮即可保存截图

方法3:录制屏幕后提取单帧

用screenrecord录制虚拟屏视频,再提取帧作为截图:

  1. 录制虚拟屏视频:
    adb shell screenrecord --display-id virtual:com.android.emulator.multidisplay:1234562 /sdcard/virtual_screen.mp4
    
    (替换为目标虚拟屏的完整uniqueId,可从adb shell cmd display get-displays获取)
  2. 拉取视频到本地:
    adb pull /sdcard/virtual_screen.mp4 .
    
  3. 用ffmpeg提取单帧:
    ffmpeg -i virtual_screen.mp4 -vframes 1 virtual_screenshot.png
    

注意事项

  • 使用screenrecord时,必须传入完整的虚拟屏uniqueId(如virtual:com.android.emulator.multidisplay:1234562),仅数字ID无法识别

内容的提问来源于stack exchange,提问作者Vamoos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 07:53:11