How to take a screenshot of a current Activity and then share it? How to take a screenshot of a current Activity and then share it? android android

How to take a screenshot of a current Activity and then share it?


This is how I captured the screen and shared it.

First, get root view from current activity:

View rootView = getWindow().getDecorView().findViewById(android.R.id.content);

Second, capture the root view:

 public static Bitmap getScreenShot(View view) {       View screenView = view.getRootView();       screenView.setDrawingCacheEnabled(true);       Bitmap bitmap = Bitmap.createBitmap(screenView.getDrawingCache());       screenView.setDrawingCacheEnabled(false);       return bitmap; }

Third, store the Bitmap into the SDCard:

public static void store(Bitmap bm, String fileName){    final static String dirPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Screenshots";    File dir = new File(dirPath);    if(!dir.exists())        dir.mkdirs();    File file = new File(dirPath, fileName);    try {        FileOutputStream fOut = new FileOutputStream(file);        bm.compress(Bitmap.CompressFormat.PNG, 85, fOut);        fOut.flush();        fOut.close();    } catch (Exception e) {        e.printStackTrace();    }}

At last, share the screenshot of current Activity:

private void shareImage(File file){    Uri uri = Uri.fromFile(file);    Intent intent = new Intent();    intent.setAction(Intent.ACTION_SEND);    intent.setType("image/*");    intent.putExtra(android.content.Intent.EXTRA_SUBJECT, "");    intent.putExtra(android.content.Intent.EXTRA_TEXT, "");    intent.putExtra(Intent.EXTRA_STREAM, uri);    try {        startActivity(Intent.createChooser(intent, "Share Screenshot"));    } catch (ActivityNotFoundException e) {        Toast.makeText(context, "No App Available", Toast.LENGTH_SHORT).show();    }}

I hope you will be inspired by my codes.

UPDATE:

Add below permissions into your AndroidManifest.xml:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

Because it creates and accesses files in external storage.

UPDATE:

Starting from Android 7.0 Nougat sharing file links are forbiden. To deal with this you have to implement FileProvider and share "content://" uri not "file://" uri.

Here is a good description how to do it.


create share button with click on listener

    share = (Button)findViewById(R.id.share);    share.setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(View v) {            Bitmap bitmap = takeScreenshot();            saveBitmap(bitmap);            shareIt();        }    });

Add two methods

    public Bitmap takeScreenshot() {    View rootView = findViewById(android.R.id.content).getRootView();    rootView.setDrawingCacheEnabled(true);    return rootView.getDrawingCache();    }public void saveBitmap(Bitmap bitmap) {    imagePath = new File(Environment.getExternalStorageDirectory() + "/screenshot.png");    FileOutputStream fos;    try {        fos = new FileOutputStream(imagePath);        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);        fos.flush();        fos.close();    } catch (FileNotFoundException e) {        Log.e("GREC", e.getMessage(), e);    } catch (IOException e) {        Log.e("GREC", e.getMessage(), e);    }}

Share screen shot. sharing implementation here

    private void shareIt() {    Uri uri = Uri.fromFile(imagePath);    Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND);    sharingIntent.setType("image/*");    String shareBody = "In Tweecher, My highest score with screen shot";    sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "My Tweecher score");    sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, shareBody);    sharingIntent.putExtra(Intent.EXTRA_STREAM, uri);    startActivity(Intent.createChooser(sharingIntent, "Share via"));    }


You can the below code to get the bitmap for the view you are seeing on screen You can specify which view to create bitmap.

    public static Bitmap getScreenShot(View view) {           View screenView = view.getRootView();           screenView.setDrawingCacheEnabled(true);           Bitmap bitmap = Bitmap.createBitmap(screenView.getDrawingCache());           screenView.setDrawingCacheEnabled(false);           return bitmap;     }