test virtual display

Android SDK min 21 Android SDK target 28

VirtualDisplay 配合 scrcpy 简单实现多窗口镜像

更新

  • 添加了广播操作

起因

先是在B站看到了这个视频

其中实现的"同时使用多个应用"引起了我的注意

然而我主力 ArchLinux up 又没写 Linux 端还没开源

无奈只能想办法自己动手解决

但难点在于如何让应用跑在别的屏幕上

经过一番艰难的搜索后 找到了

https://source.android.com/devices/tech/display/multi_display

https://github.com/android/media-samples/tree/main/ScreenCapture

经过简单的修改ScreenCaptureFragment.java

182c182
<                 DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
---
>                 DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC,

实现了

原理

1.应用通过MediaProjection创建VirtualDisplay记录displayID

mediaProjection.createVirtualDisplay(
            name, width, height, DisplayMetrics.DENSITY_DEFAULT,
            DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC,
            surface, null, null)

2.adb使应用在虚拟显示屏上启动

adb shell am start-activity --display $displayID $intent

3.scrcpy镜像虚拟屏幕

scrcpy --display $displayID

效果

此处应有视频

已知问题

  • Android SDK target 28 29+会限制VirtualDisplay的创建 要求必须使用前台服务 这里使用28只是图方便
  • 没有输入法 其实会出现在主屏幕上
  • 没有系统装饰(返回, 主页 ...) 或许需要系统应用才能创建
  • 没有声音 scrcpy的责任