Поиск наиболее эффективного и надежного способа записи собственного приложения. Определенно, 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()
для моей цели? И если да, был бы благодарен за некоторые подсказки, как заставить это работать.