截取Android模拟器虚拟显示的屏幕截图(通过ADB)

问题描述 投票:0回答:1

我正在使用具有多个显示器(物理设备和模拟器)的 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
。在这种情况下,这两个命令都会显示所有三个显示屏,我可以截取其中任何一个的屏幕截图。

还有其他方法可以截取虚拟显示的屏幕截图吗?还是我做错了什么?

android adb screenshot emulation android-multi-display
1个回答
0
投票

要使用虚拟显示 ID,请使用以下命令

adb shell dumpsys SurfaceFlinger --displays

这将显示 64 位虚拟显示 ID,例如

...
Virtual Display 11529215050235899651
...

然后使用这个数字作为屏幕截图的参数

adb shell screencap -d 11529215050235899651

请记住,虚拟显示器的显示器 ID 在每次启动时都是随机分配的。

但是,不确定您正在使用的设备/操作系统版本,但假设您的设备是 Android 14,则存在一个已知错误,即 screencap 不适用于虚拟显示 ID。此问题已在 Android 15 中修复。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.