从布局截取屏幕截图并通过android分享

时间:2015-06-11 19:18:39

标签: android android-intent bitmap

我使用下面的代码从我的布局中截取屏幕截图并通过android意图分享它,但在所选应用程序中捕获的屏幕截图并未显示任何内容。

@Override
public void onClick(View view) {

           shareBitmap(this,takeScreenshot());

}

public Bitmap takeScreenshot() {
    try{
        View rootView = getWindow().getDecorView().findViewById(R.id.lyt_main_report_activity);
        rootView.setDrawingCacheEnabled(true);
        return rootView.getDrawingCache();
    }catch (Exception ex){
        ex.printStackTrace();
    }

    return null;

}
public static void shareBitmap(Context context, Bitmap bitmap){

    //save to sd card
    try {

        File cachePath = new File(context.getCacheDir(), "images");
        cachePath.mkdirs(); // don't forget to make the directory
        FileOutputStream stream = new FileOutputStream(cachePath + "/image.png"); // overwrites this image every time
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
        stream.close();

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    try{
        //start share activity
        File imagePath = new File(context.getCacheDir(), "images");
        File newFile = new File(imagePath, "image.png");
        Uri contentUri = Uri.fromFile(newFile); //FileProvider.getUriForFile(context, "com.persianswitch.apmb.app.fileprovider", newFile);

        if (contentUri != null) {
            Intent shareIntent = new Intent();
            shareIntent.setAction(Intent.ACTION_SEND);
            //shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // temp permission for receiving app to read this file
           // shareIntent.setDataAndType(contentUri, context. getContentResolver().getType(contentUri));
            shareIntent.putExtra(Intent.EXTRA_STREAM, contentUri);
            shareIntent.setType("image/*");
            context.startActivity(Intent.createChooser(shareIntent, context.getResources().getString(R.string.share_using)));

        }
    }catch (Exception ex){
        ex.printStackTrace();
    }
}

3 个答案:

答案 0 :(得分:2)

请使用此代码,这是经过测试的代码:

public static void takeScreenshot(Context context, View view) {

String path = Environment.getExternalStorageDirectory().toString()
        + "/" + "test.png";  


View v = view.findViewById(android.R.id.content).getRootView();
v.setDrawingCacheEnabled(true);

v.setDrawingCacheEnabled(true);
Bitmap bitmap = Bitmap.createBitmap(v.getDrawingCache());
v.setDrawingCacheEnabled(false);

OutputStream out = null;
File imageFile = new File(path);

try {
    out = new FileOutputStream(imageFile);
    // choose JPEG format
    bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
    out.flush();
} catch (FileNotFoundException e) {
    // manage exception
} catch (IOException e) {
    // manage exception
} finally {

    try {   
        if (out != null) {
            out.close();
        }

    } catch (Exception exc) {
    }

}

// onPauseVideo();
Intent share = new Intent(Intent.ACTION_SEND);

share.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(imageFile));
share.setType("image/png");
((Activity) context).startActivityForResult(
        Intent.createChooser(share, "Share Drawing"), 111);

}

答案 1 :(得分:0)

如果没有任何反应,则表示您的Bitmap null正在检查。或者您也可以使用View.buildDrawingCache();,这会将视图绘制到位图,然后调用View.getDrawingCache();

  

当打开硬件加速时,启用绘图缓存对渲染没有影响,因为系统使用不同的加速机制忽略该标志。如果要对视图使用位图,即使启用了硬件加速,请参阅setLayerType(int, android.graphics.Paint)以获取有关如何启用软件和硬件层的信息。

引用来自documented page

希望有所帮助

答案 2 :(得分:0)

Tipp:当您的设备有外部存储空间时,已检查的答案有效。以三星6为例,它没有。因此,您需要使用fileprovider。

只是有人像我一样陷入这个陷阱。问题是你要将图像的名称放两次。

FileOutputStream stream = new FileOutputStream(cachePath + "/image.png"); 

而不是再次。

 File newFile = new File(imagePath, "image.png");

将借调的一个更改为

File newFile = new File(imagePath);

否则contentUri会为您提供截屏的位图。我希望这可以帮助别人。花了我3个小时来搞清楚:)