所以,我有一个相机预览(由表面视图支持),并将常规的Android UI视图作为叠加层放置在预览上。如何对显示的屏幕视图进行简单的屏幕截图。
我尝试了MediaProjection
但无法使其工作(我仍在弄清楚为什么它不起作用)。但我只想将MediaProjection
用作最后一个选项,因为它涉及启动新活动。我也PixelCopy
阅读了有关这个新 API 的信息,但不确定它是否适用于合成视图(surafceview 和常规视图),但仍然需要弄清楚该 API 是否适合我。
请注意,当屏幕基本上显示 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;
}
}