获取黑色屏幕截图

时间:2018-01-03 21:55:08

标签: android scrollview screenshot android-bitmap

基本上,我想截取整个scrollView的截图。我尝试了很多方法,但找不到完美的方法。

我试过以下:

public void takeScreenShot() {
    mbitmap = getBitmapOFRootView();
    createImage(mbitmap);
}

public void createImage(Bitmap bmp) {

    String path = Environment.getExternalStorageDirectory().toString() + "/screenshot.jpg";
    try {
        FileOutputStream outputStream = new FileOutputStream(new File(path));
        bmp.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);
        outputStream.flush();
        outputStream.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public Bitmap getBitmapOFRootView() {
    mScrollView.setDrawingCacheEnabled(true);
    int totalHeight = mScrollView.getChildAt(0).getHeight();
    int totalWidth = mScrollView.getChildAt(0).getWidth();
    mScrollView.layout(0,0, totalWidth, totalHeight);
    mScrollView.buildDrawingCache(true);
    Bitmap b = Bitmap.createBitmap(mScrollView.getDrawingCache());
    mScrollView.setDrawingCacheEnabled(false);
    return b;
}

这种方法几乎可行,但它只显示了2个视图和一个按钮,除了整个屏幕是黑色的:

Current ScreenShot

我的xml包含很多视图,它的视图层次结构是这样的:

<ScrollView>
   <ConstraintLayout>
     <Views>
      ....
     <Views>
   </ConstraintLayout>
</ScrollView>

我引用了很多StackOverflow帖子,但它没有用。 那么有人可以帮我吗?

更新 终于找到了解决方案。所以,这是一个背景问题,通过绘制画布来解决它。如下所示:

Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    Drawable bgDrawable = view.getBackground();
    if (bgDrawable != null)
        bgDrawable.draw(canvas);
    else
        canvas.drawColor(Color.WHITE);
    view.draw(canvas);

    return bitmap;

2 个答案:

答案 0 :(得分:0)

您应该使用相同的画布

public static Bitmap saveBitmapFromView(View view, int width, int height) {
 Bitmap bmp = Bitmap.createBitmap(width , height, Bitmap.Config.ARGB_8888);                
 Canvas canvas = new Canvas(bmp);
 view.layout(0, 0, view.getLayoutParams().width, view.getLayoutParams().height);
 view.draw(canvas);
 return bmp;
}

答案 1 :(得分:0)

以编程方式在Android中获取和共享屏幕截图

我到处搜索过,但是发现这是可行的

takeAndShareScreenshot()

    private void takeAndShareScreenshot(){
        Bitmap ss = takeScreenshot();
        saveBitmap(ss);
        shareIt();
    }

takeScreenshot()

    private Bitmap takeScreenshot() {
        View view = // decore view of the activity/fragment;
        view.setDrawingCacheEnabled(true);
        return view.getDrawingCache();
    }

saveBitmap()

private void saveBitmap(Bitmap bitmap) {
// path to store screenshot and name of the file
        imagePath = new File(requireContext().getExternalFilesDir(Environment.DIRECTORY_PICTURES) + "/" + "name_of_file" + ".jpg");
        FileOutputStream fos;
        try {
            fos = new FileOutputStream(imagePath);
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
            fos.flush();
            fos.close();
        } catch (IOException e) {
            Log.e("GREC", e.getMessage(), e);
        }
    }

shareIt()

private void shareIt() {
        try {
            Uri uri = Uri.fromFile(imagePath);
            Intent sharingIntent = new Intent(Intent.ACTION_SEND);
            sharingIntent.setType("image/*");
            String shareBody = getString(R.string.share_body_text);
            sharingIntent.putExtra(Intent.EXTRA_SUBJECT, R.string.subject);
            sharingIntent.putExtra(Intent.EXTRA_TEXT, shareBody);
            sharingIntent.putExtra(Intent.EXTRA_STREAM, uri);

            startActivity(Intent.createChooser(sharingIntent, "Share via"));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

注意:

In recent versions of android (>Marshmallow I guess), you may need `write 
access to external directory`