Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android take screen shot programmatically

First off i am writing a root app so root permissions are no issue. I've searched and searched and found a lot of code that never worked for me here is what i've pieced together so far and sorta works. When i say sorta i mean it makes an image on my /sdcard/test.png however the file is 0 bytes and obviously can't be viewed.

public class ScreenShot extends Activity{  View content;  @Override protected void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentView(R.layout.blank);     content = findViewById(R.id.blankview);     getScreen(); }  private void getScreen(){     Bitmap bitmap = content.getDrawingCache();     File file = new File("/sdcard/test.png");     try      {         file.createNewFile();         FileOutputStream ostream = new FileOutputStream(file);         bitmap.compress(CompressFormat.PNG, 100, ostream);         ostream.close();     }      catch (Exception e)      {         e.printStackTrace();     } } } 

Any help on how i can take a screen shot in android via code would be greatly appreciated thank you!

===EDIT===

The following is everything i'm using the image is made on my sdcard and is no longer 0bytes but the entire thing is black there is nothing on it. I've bound the activity to my search button so when i'm some where on my phone i long press search and it is supposed to take a screen shot but i just get a black image? Everything is set transparent so i'd think it should grab whatever is on the screen but i just keep getting black

Manifest

<activity android:name=".extras.ScreenShot"     android:theme="@android:style/Theme.Translucent.NoTitleBar"     android:noHistory="true" >     <intent-filter>         <action android:name="android.intent.action.SEARCH_LONG_PRESS" />         <category android:name="android.intent.category.DEFAULT" />     </intent-filter>     </activity> 

XML

<?xml version="1.0" encoding="utf-8"?> <LinearLayout   xmlns:android="http://schemas.android.com/apk/res/android"   android:orientation="vertical"   android:layout_width="match_parent"   android:layout_height="match_parent"   android:background="#00000000"   android:id="@+id/screenRoot">     </LinearLayout> 

Screenshot class

public class ScreenShot extends Activity{  View content;  @Override protected void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentView(R.layout.screenshot);     content = findViewById(R.id.screenRoot);     ViewTreeObserver vto = content.getViewTreeObserver();     vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {       @Override       public void onGlobalLayout() {         content.getViewTreeObserver().removeGlobalOnLayoutListener(this);         getScreen();       }     }); }  private void getScreen(){     View view = content;     View v = view.getRootView();     v.setDrawingCacheEnabled(true);     Bitmap b = v.getDrawingCache();                  String extr = Environment.getExternalStorageDirectory().toString();     File myPath = new File(extr, "test.jpg");     FileOutputStream fos = null;     try {         fos = new FileOutputStream(myPath);         b.compress(Bitmap.CompressFormat.JPEG, 100, fos);         fos.flush();         fos.close();         MediaStore.Images.Media.insertImage(getContentResolver(), b, "Screen", "screen");     }catch (FileNotFoundException e) {         // TODO Auto-generated catch block         e.printStackTrace();     } catch (Exception e) {         // TODO Auto-generated catch block         e.printStackTrace();     }     finish(); } } 
like image 718
user577732 Avatar asked Oct 14 '11 03:10

user577732


1 Answers

Here you go...I used this:

View v = view.getRootView(); v.setDrawingCacheEnabled(true); Bitmap b = v.getDrawingCache(); String extr = Environment.getExternalStorageDirectory().toString(); File myPath = new File(extr, getString(R.string.free_tiket)+".jpg"); FileOutputStream fos = null; try {     fos = new FileOutputStream(myPath);     b.compress(Bitmap.CompressFormat.JPEG, 100, fos);     fos.flush();     fos.close();     MediaStore.Images.Media.insertImage( getContentResolver(), b,                                           "Screen", "screen"); } catch (FileNotFoundException e) {     // TODO Auto-generated catch block     e.printStackTrace(); } catch (Exception e) {     // TODO Auto-generated catch block     e.printStackTrace(); } 

v iz root layout...just to point ;)))

like image 151
Jovan Avatar answered Oct 22 '22 09:10

Jovan