В моем сценарии я хочу отразить другое приложение в моем приложении.
Я использую DisplayManager
до createVirtualDisplay
для моего SurfaceView
. Затем я устанавливаю DisplayId
как VirtualDisplay
в AcitivityOptions
, когда я начинаю деятельность.
Таким образом, в моем виде с поверхности можно успешно запустить другое приложение. Но есть некоторые проблемы с отображением. Согласно моему тесту, только изображение, цвет фона и 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());
В отличие от этого, если я отражаю ту же активность на Display
вместо VirtualDisplay
, который может быть захвачен с помощью MediaRouter
или DisplayManager
, Таким образом, все отображается правильно (в моем тесте я моделирую второй монитор с помощью «Параметры разработчика» -> «Имитировать вторичные дисплеи»):
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());
Есть ли какой-то процесс, который я пропускаю или какие-либо флаги, которые я неверно настроить в режиме виртуального дисплея? Спасибо за любую помощь.
PS Чтобы отразить другое приложение, я рутирован и запущен как системное приложение.