在我的场景中,我想在我的应用程序中镜像另一个应用程序。
我DisplayManager用来createVirtualDisplay为我的SurfaceView. 然后我在开始活动时设置DisplayId为这个。VirtualDisplayAcitivityOptions
通过这个过程,另一个应用程序可以在我的表面视图中成功启动。但是有一些显示问题。根据我的测试,只有图像、背景颜色和GLSurfaceView.Renderer渲染正确。诸如TextView和 之类的 ui 组件Button不会在SurfaceView.
从上面的测试结果来看,我猜测可能与渲染的深度或顺序有关。
示例代码如下:
SurfaceView surfaceView = findViewById(R.id.surface_view);
int flags = DisplayManager.VIRTUAL_DISPLAY_FLAG_PRESENTATION |
DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC |
DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR;
DisplayManager displayManager = (DisplayManager) getSystemService(Context.DISPLAY_SERVICE);
VirtualDisplay virtualDisplay = displayManager.createVirtualDisplay("MyVirtualDisplay",
surfaceView.getWidth(), surfaceView.getHeight(), 1, surfaceView.getHolder().getSurface(),
flags);
int displayId = virtualDisplay.getDisplay().getDisplayId();
ActivityOptions options = ActivityOptions.makeBasic().setLaunchDisplayId(displayId);
Intent intent = getPackageManager().getLaunchIntentForPackage(appName);
intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent, options.toBundle());
Run Code Online (Sandbox Code Playgroud)
相比之下,如果我将相同的活动镜像到一个Display而不是VirtualDisplay,则可以由MediaRouter或捕获DisplayManager。这样,一切都正确显示(在我的测试中,我通过“开发人员选项”->“模拟辅助显示器”模拟第二台显示器):
MediaRouter …Run Code Online (Sandbox Code Playgroud) 概念:
我有一个用 Kotlin 编写的 Android 应用程序,它只需在外部显示器上启动 Android 应用程序即可。显示器可以是 AirServer、Miracast、Microsoft Connect、USB-OTG HDMI、USB-C HDMI 或模拟辅助显示器(参见屏幕截图)。
这是执行“繁重工作”的代码的例外情况:
val intent = packageManager.getLaunchIntentForPackage(info.id)
val dm = recyclerView.context.getSystemService(Service.DISPLAY_SERVICE) as DisplayManager
val displays = dm.getDisplays(DisplayManager.DISPLAY_CATEGORY_PRESENTATION)
for (display in displays) {
val options = ActivityOptions.makeBasic()
options.launchDisplayId = display.displayId
recyclerView.context.startActivity(intent, options.toBundle())
break
}
Run Code Online (Sandbox Code Playgroud)
应用程序开始正常。请参阅屏幕截图,我用它来将 Minecraft 袖珍版启动到模拟辅助显示器(就好像连接了外部 HDMI 显示器一样)。问题是我无法将触摸或光标输入发送到虚拟显示器。
什么有效:
adb shell input -d <display-id> tap <x> <y>什么不起作用:
我尝试过的:
的输出dumpsys display显示虚拟显示器都缺少touch VIRTUAL内部显示器具有的参数。我不确定这是否意味着显示器本身不支持触摸屏输入,或者只是未启用。
我尝试强制应用程序进入前台,这使应用程序检测键盘和控制器输入,但光标仍然锁定在内部显示窗口。
值得注意的是,Android 10 桌面模式开发人员设置确实将光标放入外部显示器而不是内部显示器。这就是我正在努力实现的目标。
Android …
我使用 Android Studio 4.2.1(最新),并在我尝试过的两种设备中观察到此行为:Pixel C (API 30) 13.5 Freeform (API 30)
按照这些说明在我的 Android 模拟器上获取 Play 商店,然后下载 Tiktok,每次我尝试打开它时,该应用程序加载很少,几秒钟后就崩溃了。我什至点击了谷歌搜索结果中的一段 Tiktok 视频,打开了应用程序,没有加载任何内容,然后就崩溃了。
TL;DR:当我尝试在 Android 模拟器中打开 Tiktok 应用程序时,该应用程序(而不是模拟器)崩溃了。
有人知道这个问题的修复方法吗(或者我应该向 Google 报告该错误?)?