我正在使用具有多个显示器(物理设备和模拟器)的 Android 设备,并希望通过 ADB 截取每个显示器的屏幕截图。我遇到的问题是,每当我的模拟器上有虚拟显示器时(通过单击 三个点 -> 显示器从 Android 模拟器的设置创建额外显示器时获得的显示器) -> 添加辅助显示器),我无法截图。
接下来我将解释我如何进行此操作以及我得到的输出。
屏幕截图命令是
adb shell screencap -d <display_id> sdcard/screenshot.png
。我通过 adb shell dumpsys SurfaceFlinger --display-id
获取我的显示 ID(如 screencap
文档所建议)。检查我有多少显示器的另一种方法是adb shell cmd display get-displays
。
adb shell cmd display get-displays
的输出为:
Displays:
Display id 0: DisplayInfo{"Built-in Screen", displayId 0", displayGroupId 0, ..., type INTERNAL, uniqueId "local:4619827259835644672", ..., isValid=true
Display id 2: DisplayInfo{"Emulator 2D Display", displayId 2", displayGroupId 0, ..., type VIRTUAL, uniqueId "virtual:com.android.emulator.multidisplay:1234562", ..., isValid=true
Display id 3: DisplayInfo{"Emulator 2D Display", displayId 3", displayGroupId 0, ..., type VIRTUAL, uniqueId "virtual:com.android.emulator.multidisplay:1234563", ..., isValid=true
这会看到我的所有显示器(一个主显示器和两个添加的显示器),并为我提供必须提供给屏幕捕获命令的
uniqueId
(此处为4619827259835644672
、1234562
、1234563
)。
但是
adb shell dumpsys SurfaceFlinger --display-id
的输出是:
Display 4619827259835644672 (HWC display 0): port=0 pnpId=GGL displayName="EMU_display_0"
这只能看到非虚拟显示器。虚拟显示器的两个 ID 丢失。
现在的问题是:我只能使用
SurfaceFlinger
命令看到的 ID 来截取显示屏幕截图。所以 4619827259835644672
可以工作,但其他两个不行(如果我尝试捕获他们的屏幕,我只会得到空的 PNG 和 error code 1
)。换句话说,我无法截取虚拟模拟器显示的屏幕截图。
我尝试过使用具有多个显示屏的物理 Android 设备,效果很好,因为额外的显示屏被列为
type EXTERNAL
。在这种情况下,这两个命令都会显示所有三个显示屏,我可以截取其中任何一个的屏幕截图。
还有其他方法可以截取虚拟显示的屏幕截图吗?还是我做错了什么?
要使用虚拟显示 ID,请使用以下命令
adb shell dumpsys SurfaceFlinger --displays
这将显示 64 位虚拟显示 ID,例如
...
Virtual Display 11529215050235899651
...
然后使用这个数字作为屏幕截图的参数
adb shell screencap -d 11529215050235899651
请记住,虚拟显示器的显示器 ID 在每次启动时都是随机分配的。
但是,不确定您正在使用的设备/操作系统版本,但假设您的设备是 Android 14,则存在一个已知错误,即 screencap 不适用于虚拟显示 ID。此问题已在 Android 15 中修复。