如何通过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录制虚拟屏视频,再提取帧作为截图:
- 录制虚拟屏视频:
(替换为目标虚拟屏的完整adb shell screenrecord --display-id virtual:com.android.emulator.multidisplay:1234562 /sdcard/virtual_screen.mp4uniqueId,可从adb shell cmd display get-displays获取) - 拉取视频到本地:
adb pull /sdcard/virtual_screen.mp4 . - 用ffmpeg提取单帧:
ffmpeg -i virtual_screen.mp4 -vframes 1 virtual_screenshot.png
注意事项
- 使用
screenrecord时,必须传入完整的虚拟屏uniqueId(如virtual:com.android.emulator.multidisplay:1234562),仅数字ID无法识别
内容的提问来源于stack exchange,提问作者Vamoos
相关产品推荐
相关产品推荐

