title: Android take screen shot programmatically
body: <p>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.</p>
  
  <pre><code>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();
      }
  }
  }
  </code></pre>
  
  <p>Any help on how i can take a screen shot in android via code would be greatly appreciated thank you!</p>
  
  <p><strong>===EDIT===</strong></p>
  
  <p>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</p>
  
  <p><strong>Manifest</strong></p>
  
  <pre><code>&lt;activity android:name=".extras.ScreenShot"
      android:theme="@android:style/Theme.Translucent.NoTitleBar"
      android:noHistory="true" &gt;
      &lt;intent-filter&gt;
          &lt;action android:name="android.intent.action.SEARCH_LONG_PRESS" /&gt;
          &lt;category android:name="android.intent.category.DEFAULT" /&gt;
      &lt;/intent-filter&gt;
      &lt;/activity&gt;
  </code></pre>
  
  <p><strong>XML</strong></p>
  
  <pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt;
  &lt;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"&gt;    
  &lt;/LinearLayout&gt;
  </code></pre>
  
  <p><strong>Screenshot class</strong></p>
  
  <pre><code>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();
  }
  }
  </code></pre>