Запись собственного экрана приложения (не MediaProjection) - PullRequest
0 голосов
/ 28 апреля 2020

Поиск наиболее эффективного и надежного способа записи собственного приложения. Определенно, MediaProjection не является опцией, поскольку она захватывает все снаружи.

До сих пор я придумал эти опции:

1) Чтение root Просмотр кеша

    View view = getWindow().getDecorView().getRootView();
    view.setDrawingCacheEnabled(true);
    Bitmap bitmap = Bitmap.createBitmap(v1.getDrawingCache());
    view.setDrawingCacheEnabled(false);

2) Рисование root просмотр на холсте

    View view = getWindow().getDecorView().getRootView();
    Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    view.draw(canvas);

3) Но я в основном использую DisplayManager # createVirtualDisplay () . Как сказано в этом ответе:

Вы настроите виртуальный дисплей так, чтобы он отображал только свое приложение windows, только если вы используете createVirtualDisplay () напрямую, а не через MediaProjectionManager.

Поскольку я предполагаю, что код должен выполнять эту работу:

    ImageReader reader = ImageReader.newInstance(WIDTH, HEIGHT, PixelFormat.RGBA_8888, 2);
    final DisplayManager displayManager = getSystemService(DisplayManager.class);
    int flags = VIRTUAL_DISPLAY_FLAG_PRESENTATION | VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY;
    VirtualDisplay virtualDisplay = displayManager.createVirtualDisplay("test", WIDTH, HEIGHT, DENSITY, reader.getSurface(), flags);

Но полученный битовый массив всегда был пустым (с использованием bitmap.copyPixelsFromBuffer(buffer);). Чтение документации не очень помогло.

Итак, мой вопрос: можно ли вообще использовать этот метод DisplayManager#createVirtualDisplay() для моей цели? И если да, был бы благодарен за некоторые подсказки, как заставить это работать.

...