KIRAN K J
KIRAN K J

Reputation: 732

How to programmatically take screenshot of an android application without notification and navigation bars

I am using the below code for taking screenshot in my application.

View rootView = findViewById(android.R.id.content).getRootView();
rootView.setDrawingCacheEnabled(true);
rootView.buildDrawingCache(true);
Bitmap bitmap = rootView.getDrawingCache();

But I am getting an image with two black portion in the top and bottom by the notification and navigation bars. I need to remove those black areas. I need not to replace those area with the notification and navigation bars. But i need the toolbar.

Upvotes: 1

Views: 1667

Answers (4)

ND1010_
ND1010_

Reputation: 3841

Following is the XML layout file where I have added a button, textview and an imageview in a linear layout. And I have also added onClick attribute in the button.

<?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/activity_screenshoat"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context="com.ncrypted.myapplication.Screenshoat">

        <Button
            android:id="@+id/btnScreenshot"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Taake screen shot"/>
        <ImageView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/imageView"/>

    </LinearLayout>

This is android activity file where I have added some java code to take screenshot and import android.graphics.Bitmap;, java.io.ByteArrayOutputStream;, java.io.File; etc.

public class Screenshoat extends AppCompatActivity {

    Button btnScreenshot;
    Bitmap mbitmap;
    ImageView imageView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_screenshoat);

        btnScreenshot = (Button) findViewById(R.id.btnScreenshot);
        imageView = (ImageView) findViewById(R.id.imageView);
        btnScreenshot.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mbitmap = getBitmapOFRootView(v);
                imageView.setImageBitmap(mbitmap);
                createImage(mbitmap);
                Toast.makeText(Screenshoat.this, "Screen shoat created", Toast.LENGTH_SHORT).show();
            }
        });



    }
    public Bitmap getBitmapOFRootView(View v) {
        View rootview = v.getRootView();
        rootview.setDrawingCacheEnabled(true);
        Bitmap bitmap1 = rootview.getDrawingCache();
        return bitmap1;
    }

    public void createImage(Bitmap bmp) {
        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
        bmp.compress(Bitmap.CompressFormat.JPEG, 40, bytes);
        File file = new File(Environment.getExternalStorageDirectory() +
                "/capturedscreenandroid.jpg");
        try {
            file.createNewFile();
            FileOutputStream outputStream = new FileOutputStream(file);
            outputStream.write(bytes.toByteArray());
            outputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

Add Permission to read and write external storage

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

Upvotes: 0

Nabin Bhandari
Nabin Bhandari

Reputation: 16409

take the drawing cache of the root Layout as below:

//onCreate
setContentView(R.layout.activity_main);
layout = (RelativeLayout) findViewById(R.id.activity_main);
layout.setDrawingCacheEnabled(true);

And to get bitmap, the usual way,

Bitmap bitmap = layout.getDrawingCache();

activity_main:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

    <android.support.v7.widget.Toolbar
    android:id="@+id/toolBar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:background="@color/colorPrimary" />

    <!--other content-->

</RelativeLayout>

Upvotes: 1

Chandana_Raj
Chandana_Raj

Reputation: 116

Take this to another Linear Layout

  <LinearLayout 
   android:id="@+id/linear"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="vertical">       

   <Button
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:text="@string/munch"
     android:id="@+id/munchscreen"/>
   <ImageView
     android:layout_width="200dp"
     android:layout_height="200dp"
     android:id="@+id/screenshots"
     android:contentDescription="@string/app_name"
     />
  </LinearLayout>

Now find Id for this Linear Layout on oncreate() method making it global variable

   LinearLayout ll;

   ll = (LinearLayout)findViewById(R.id.linear);

now capture this screen:

 ll.setDrawingCacheEnabled(true);

 ll.buildDrawingCache(true);

 Bitmap cs = Bitmap.createBitmap(ll.getDrawingCache());

 ll.setDrawingCacheEnabled(false);

Now set this bitmap to your ImageView.

Upvotes: 0

Ronak Thakkar
Ronak Thakkar

Reputation: 2525

Use Below Method:

public static Bitmap loadBitmapFromView(Context context, View v) {
    DisplayMetrics dm = context.getResources().getDisplayMetrics();
    v.measure(View.MeasureSpec.makeMeasureSpec(dm.widthPixels, View.MeasureSpec.EXACTLY),
            View.MeasureSpec.makeMeasureSpec(dm.heightPixels, View.MeasureSpec.EXACTLY));
    v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight());
    Bitmap returnedBitmap = Bitmap.createBitmap(v.getMeasuredWidth(),
            v.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
    Canvas c = new Canvas(returnedBitmap);
    v.draw(c);

    return returnedBitmap;
}

Pass your parent view inside the argument.

Upvotes: 0

Related Questions