拍摄常规View和SurfaceView的复合屏幕视图的屏幕快照

时间:2019-01-10 07:35:03

标签: android screenshot android-view surfaceview android-mediaprojection

因此,我有一个Camera Preview(由曲面视图支持),并以常规的Android UI视图作为预览的叠加层。如何对显示的屏幕视图进行简单的屏幕截图。

我尝试使用MediaProjection,但无法使其正常工作(我仍在弄清楚为什么它不工作)。但是我只想将MediaProjection用作最后一个选项,因为它涉及启动新活动。我还阅读了有关此新API PixelCopy的信息,但不确定它是否适用于组合视图(包括surafceview和常规视图),但仍想弄清楚该API是否适合我。

请注意,我正在尝试截取屏幕截图,该屏幕基本上显示了2个窗口及其各自的表面,以提供最终显示。任何有这种情况的示例代码或某些指针的人都将不胜感激。

2 个答案:

答案 0 :(得分:0)

这可能会有所帮助: 将视图对象传递给函数,它将捕获该特定视图的屏幕截图。

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;
    }

答案 1 :(得分:0)

你可以尝试这个图书馆吗

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;
            }
        }