Activity 在辅助虚拟显示器上启动时显示不正确
Activity displays incorrect when launched on a secondary virtualdisplay
在我的场景中,我想在我的应用程序中镜像另一个应用程序。
我的 SurfaceView
使用 DisplayManager
到 createVirtualDisplay
。然后当我开始 activity.
时,我在 AcitivityOptions
中将 DisplayId
设置为这个 VirtualDisplay
通过这个过程,另一个应用程序可以在我的surfaceview中成功启动。但是有一些显示问题。根据我的测试,只有图像、背景颜色和 GLSurfaceView.Renderer
被正确渲染。 ui 组件(例如 TextView
和 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());
相比之下,如果我将相同的 activity 镜像到 Display
而不是 VirtualDisplay
,这可以被 MediaRouter
或 DisplayManager
捕获。这样,一切都正确显示(在我的测试中,我通过 "Developer Options" -> "Simulate Secondary Displays" 模拟第二台显示器):
MediaRouter mediaRouter = (MediaRouter)getSystemService(Context.MEDIA_ROUTER_SERVICE);
MediaRouter.RouteInfo route = mediaRouter.getSelectedRoute(MediaRouter.ROUTE_TYPE_LIVE_VIDEO);
Display presentationDisplay = route.getPresentationDisplay();
int displayId = presentationDisplay.getDisplayId();
Intent intent = getPackageManager().getLaunchIntentForPackage(appName);
intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT | Intent.FLAG_ACTIVITY_NEW_TASK);
ActivityOptions options = ActivityOptions.makeBasic().setLaunchDisplayId(displayId);
startActivity(intent, options.toBundle());
在虚拟显示模式下是否遗漏了任何进程或错误配置的标志?感谢您的帮助。
P.S。为了镜像另一个应用程序,我已经扎根并作为系统应用程序启动。
您的问题是调用 createVirtualDisplay 时使用了错误的密度 Dpi,它应该是更大的数字,例如 480、560。
在我的场景中,我想在我的应用程序中镜像另一个应用程序。
我的 SurfaceView
使用 DisplayManager
到 createVirtualDisplay
。然后当我开始 activity.
AcitivityOptions
中将 DisplayId
设置为这个 VirtualDisplay
通过这个过程,另一个应用程序可以在我的surfaceview中成功启动。但是有一些显示问题。根据我的测试,只有图像、背景颜色和 GLSurfaceView.Renderer
被正确渲染。 ui 组件(例如 TextView
和 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());
相比之下,如果我将相同的 activity 镜像到 Display
而不是 VirtualDisplay
,这可以被 MediaRouter
或 DisplayManager
捕获。这样,一切都正确显示(在我的测试中,我通过 "Developer Options" -> "Simulate Secondary Displays" 模拟第二台显示器):
MediaRouter mediaRouter = (MediaRouter)getSystemService(Context.MEDIA_ROUTER_SERVICE);
MediaRouter.RouteInfo route = mediaRouter.getSelectedRoute(MediaRouter.ROUTE_TYPE_LIVE_VIDEO);
Display presentationDisplay = route.getPresentationDisplay();
int displayId = presentationDisplay.getDisplayId();
Intent intent = getPackageManager().getLaunchIntentForPackage(appName);
intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT | Intent.FLAG_ACTIVITY_NEW_TASK);
ActivityOptions options = ActivityOptions.makeBasic().setLaunchDisplayId(displayId);
startActivity(intent, options.toBundle());
在虚拟显示模式下是否遗漏了任何进程或错误配置的标志?感谢您的帮助。
P.S。为了镜像另一个应用程序,我已经扎根并作为系统应用程序启动。
您的问题是调用 createVirtualDisplay 时使用了错误的密度 Dpi,它应该是更大的数字,例如 480、560。