Снимок экрана составного экрана обычного вида и SurfaceView
Итак, у меня есть предварительный просмотр камеры (опираясь на вид поверхности) и обычные представления пользовательского интерфейса Android, наложенные поверх предварительного просмотра. Как мне сделать простой скриншот отображаемого экрана?
Я пробовал с MediaProjection
и не мог заставить это работать (я все еще выясняю, почему это не работает). Но я хотел бы использовать MediaProjection
только в качестве последнего варианта, поскольку он предполагает запуск нового действия. Я также читал об этом новом API PixelCopy
но не уверен, что он будет работать для составного представления (surafceview и обычных представлений), но все же выяснить, будет ли работать этот API для меня.
Обратите внимание, что я пытаюсь сделать снимок экрана, когда он в основном показывает 2 окна и их соответствующие поверхности, чтобы получить окончательное изображение. Любой, имеющий пример кода для этого сценария или какой-либо указатель будет признателен.
2 ответа
Это может быть полезно: передайте объект вида в функцию, и он сделает снимок экрана этого конкретного вида.
public static String captureScreen(View v) {
Toast.makeText(v.getContext(), "Generating Screenshot. Please wait..", Toast.LENGTH_LONG).show();
// View v = activity.getWindow().getDecorView().getRootView();
v.setDrawingCacheEnabled(true);
Bitmap bmp = Bitmap.createBitmap(v.getDrawingCache());
v.setDrawingCacheEnabled(false);
try {
File dir = new File(Environment.getExternalStorageDirectory() + "/myfolder");
if (!dir.exists()) {
dir.mkdirs();
}
File file = new File(dir, System.currentTimeMillis() + ".jpg");
FileOutputStream fos = new FileOutputStream(file);
bmp.compress(Bitmap.CompressFormat.JPEG, 90, fos);
fos.flush();
fos.close();
return file.getAbsolutePath();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
Можешь попробовать эту библиотеку
https://github.com/Muddz/PixelShot
Основная функция библиотеки это.
private Bitmap getViewBitmap() {
Bitmap bitmap;
if (view instanceof TextureView) {
bitmap = ((TextureView) view).getBitmap();
Canvas canvas = new Canvas(bitmap);
view.draw(canvas);
canvas.setBitmap(null);
return bitmap;
} else {
bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
view.draw(canvas);
canvas.setBitmap(null);
return bitmap;
}
}