title: Convert layout as image (Layout Screenshot) and store in Android
body: <p>So i want to save the RelativeLayout (360x360dp) into the phone as a picture.</p>
  
  <p>Here is the code that i found online, and on stackoverflow but it does not work. </p>
  
  <p>Using api 24.</p>
  
  <pre><code>package com.femindharamshi.instapostcreator;
  
  import android.graphics.Bitmap;
  import android.graphics.Canvas;
  import android.media.MediaScannerConnection;
  import android.net.Uri;
  import android.os.Environment;
  import android.support.v7.app.AppCompatActivity;
  import android.os.Bundle;
  import android.text.Editable;
  import android.text.TextWatcher;
  import android.util.Log;
  import android.view.View;
  import android.widget.Button;
  import android.widget.EditText;
  import android.widget.RelativeLayout;
  import android.widget.TextView;
  import android.widget.Toast;
  
  import java.io.File;
  import java.io.FileNotFoundException;
  import java.io.FileOutputStream;
  import java.io.IOException;
  import java.util.Random;
  
  public class MainActivity extends AppCompatActivity {
  
      EditText caption;
      TextView captionTv;
  
      Button savebtn;
      RelativeLayout image;
  
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
  
          image = findViewById(R.id.image);
  
          caption = findViewById(R.id.caption);
          captionTv = findViewById(R.id.captionTV);
          savebtn = findViewById(R.id.savebtn);
  
          caption.addTextChangedListener(new TextWatcher() {
              @Override
              public void beforeTextChanged(CharSequence s, int start, int count, int after) {
  
              }
  
              @Override
              public void onTextChanged(CharSequence s, int start, int before, int count) {
  
              }
  
              @Override
              public void afterTextChanged(Editable s) {
                  captionTv.setText(s);
              }
          });
  
          savebtn.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {
                  Toast.makeText(MainActivity.this, "Called", Toast.LENGTH_SHORT).show();
                  saveImage();
              }
          });
      }
  
      public void saveImage()
      {
          Bitmap bitmap;
          bitmap= viewToBitmap(image);
          saveImageToExternalStorage(bitmap);
  
  //        try {
  //            FileOutputStream output = new FileOutputStream(Environment.getExternalStorageDirectory() + "/path/to/file.png");
  //            bitmap.compress(Bitmap.CompressFormat.PNG, 100, output);
  //            output.close();
  //        } catch (FileNotFoundException e) {
  //            e.printStackTrace();
  //        } catch (IOException e) {
  //            e.printStackTrace();
  //        }
      }
  
      private void saveImageToExternalStorage(Bitmap finalBitmap) {
          String root = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString();
          File myDir = new File(root + "/saved_images");
          myDir.mkdirs();
          Random generator = new Random();
          int n = 10000;
          n = generator.nextInt(n);
          String fname = "Image-" + n + ".jpg";
          File file = new File(myDir, fname);
          if (file.exists())
              file.delete();
          try {
              FileOutputStream out = new FileOutputStream(file);
              finalBitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
              out.flush();
              out.close();
          }
          catch (Exception e) {
              e.printStackTrace();
          }
  
  
          // Tell the media scanner about the new file so that it is
          // immediately available to the user.
          MediaScannerConnection.scanFile(this, new String[] { file.toString() }, null,
                  new MediaScannerConnection.OnScanCompletedListener() {
                      public void onScanCompleted(String path, Uri uri) {
                          Log.i("ExternalStorage", "Scanned " + path + ":");
                          Log.i("ExternalStorage", "-&gt; uri=" + uri);
                      }
                  });
  
      }
  
      public Bitmap viewToBitmap(View view) {
          Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);
          Canvas canvas = new Canvas(bitmap);
          view.draw(canvas);
          return bitmap;
      }
  }
  </code></pre>
  
  <p>Yes, i have <code>&lt;uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /&gt;</code>
  in my androidmanifest.</p>
  
  <p>How to save the image ? What is the actual working way ? I want to store in in a the root of the main storage.</p>