Действие отображается некорректно при запуске на дополнительном виртуальном дисплее

В моем сценарии я хочу отразить другое приложение в своем приложении.

я использую 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 Чтобы отразить другое приложение, я рутировал и запускал как системное приложение.

1 ответ

Ваша проблема заключалась в вызове createVirtualDisplay с неправильной плотностью Dpi, это должны быть более крупные числа, например 480, 560.

Другие вопросы по тегам