In this article i will explain about taking the screenshot of the current screen with few lines of codes. It is a very handy and useful code if you play with screenshots of your app. It converts the view to a bitmap and save it in device storage for future use. I will write two functions,
- Function to make bitmap of the current screen.
- Save the bitmap as a file in the device storage.
Add Write Permissions In Manifest
Add write permission to AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="takescreenshot.devdeeds.com.takescreenshot"> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
1. Create Utility Class
Utils.java
Create utility class with two functions. One for taking screenshot of the current screen and other for saving the bitmap into a file for future use.
import android.app.Activity; import android.graphics.Bitmap; import android.graphics.Rect; import android.view.View; import java.io.FileOutputStream; import java.io.IOException; public class Utils { public static Bitmap takeScreenShot(Activity activity) { View view = activity.getWindow().getDecorView(); view.setDrawingCacheEnabled(true); view.buildDrawingCache(); Bitmap b1 = view.getDrawingCache(); Rect frame = new Rect(); activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame); int statusBarHeight = frame.top; //Find the screen dimensions to create bitmap in the same size. int width = activity.getWindowManager().getDefaultDisplay(). this method wegetWidth(); int height = activity.getWindowManager().getDefaultDisplay().getHeight(); Bitmap b = Bitmap.createBitmap(b1, 0, statusBarHeight, width, height - statusBarHeight); view.destroyDrawingCache(); return b; } public static void savePic(Bitmap b, String strFileName) { FileOutputStream fos; try { fos = new FileOutputStream(strFileName); b.compress(Bitmap.CompressFormat.PNG, 90, fos); fos.flush(); fos.close(); } catch (IOException e) { e.printStackTrace(); } } }
takeScreenShot
function will capture the screenshot and get the bitmap of the screen. savePic
will save the bitmap into the device storage as JPEG file.
2. Call It From Activity Class
Here we are creating a directory called devdeeds
if it does not exist already. You can replace it with your own directory name.
MainActivity.java
import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.Toast; import java.io.File; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override protected void onStart() { super.onStart(); shareScreen(); } private void shareScreen() { try { File cacheDir = new File( android.os.Environment.getExternalStorageDirectory(), "devdeeds"); if (!cacheDir.exists()) { cacheDir.mkdirs(); } String path = new File( android.os.Environment.getExternalStorageDirectory(), "devdeeds") + "/screenshot.jpg"; Utils.savePic(Utils.takeScreenShot(this), path); Toast.makeText(getApplicationContext(), "Screenshot Saved", Toast.LENGTH_SHORT).show(); } catch (NullPointerException ignored) { ignored.printStackTrace(); } } }
Activity Layout
Create a layout file for the activity with a Button.
res/layout/activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="takescreenshot.devdeeds.com.takescreenshot.MainActivity"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:padding="10dp" android:text="TakeScreenShot And Save" /> </RelativeLayout>
In SD Card
Capture A Particular View
Below i have add a new method called shareView()
for those who want to capture a particular view only. The only change i made to the above method, shareScreen()
, is to convert the view into a bitmap variable and pass it to Utils.savePic()
instead of bitmap of the entire screen.
public void shareView(View view) { try { File cacheDir = new File( android.os.Environment.getExternalStorageDirectory(), "devdeeds"); if (!cacheDir.exists()) { cacheDir.mkdirs(); } String path = new File( android.os.Environment.getExternalStorageDirectory(), "devdeeds") + "/screenshot.jpg"; //Get the bitmap from the view view.setDrawingCacheEnabled(true); view.buildDrawingCache(); Bitmap bm = view.getDrawingCache(); //End //Pass the generated bitmap instead. Utils.savePic(bm, path); Toast.makeText(getApplicationContext(), "Screenshot Saved", Toast.LENGTH_SHORT).show(); } catch (NullPointerException ignored) { } }