title: Capture Screenshot of SurfaceView with bitmap content on it
body: <p>I want to capture image of surface view with content draw on surface view.
  I n my app i have surface view on which user can draw some bitmap by drag and drop some objects on it.
  After that on a button click i want to store image of that surfaceview with its bitmap content in sd card.</p>
  
  <p>For these i have a canvas object and all bitmap are draw on it.
  below is my code - </p>
  
  <pre><code>                mHolder = mSurfaceView.getHolder();
                  mHolder.lockCanvas();
                  canvas.drawColor(0,Mode.CLEAR);
                  //border's properties
                  paint = new Paint();
                  FontMetrics fm = new FontMetrics();
                  Paint paint2 = new Paint();
                  paint2.setColor(Color.WHITE);
                  paint2.setTextSize(30);
                  paint2.setTextAlign(Paint.Align.CENTER);
                  paint2.getFontMetrics(fm);  
                  canvas.drawText("Building", RectLeft+60, RectTop+60, paint2);
                  paint.setStyle(Paint.Style.STROKE);
                  paint.setColor(color);
                  paint.setStrokeWidth(3);
                  canvas.drawRect(RectLeft, RectTop, RectRight, RectBottom, paint);
                  mHolder.unlockCanvasAndPost(canvas);
  </code></pre>
  
  <p>How to do that.</p>
  
  <p>Thanks in advance.</p>
  
  <p><strong>EDITED</strong></p>
  
  <p>Below is my code that captures only view that i have created in xml and not draw what i have draw on surface.</p>
  
  <pre><code>public static Bitmap getBitmapFromView(View view) {
      //Define a bitmap with the same size as the view
      Bitmap returnedBitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(),Bitmap.Config.ARGB_8888);
      //Bind a canvas to it
      Canvas canvas = new Canvas(returnedBitmap);
      //Get the view's background
      Drawable bgDrawable =view.getBackground();
      if (bgDrawable!=null) 
          //has background drawable, then draw it on the canvas
          bgDrawable.draw(canvas);
      else 
          //does not have background drawable, then draw white background on the canvas
          canvas.drawColor(Color.WHITE);
      // draw the view on the canvas
      view.draw(canvas);
      //return the bitmap
      return returnedBitmap;
  }
  </code></pre>
  
  <p><strong>EDITED</strong> my hole fragment for drawing is below-</p>
  
  <pre><code>public class DrawingLayoutFragment extends Fragment implements SurfaceHolder.Callback{
  
        @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container,
          Bundle savedInstanceState) {
    ....
    ....
     mSurfaceView = (SurfaceView) view.findViewById(R.id.surfaceview);
    init();
    return view;
  }
  
  public void init(){
      mSurfaceView.getHolder().addCallback(this);
  }
  
  @Override
  public void surfaceChanged(SurfaceHolder holder, int format, int width,
          int height) {
          RectLeft = width/2 - 60;
          RectTop = height/2 - 60 ;
          RectRight = width/2 + 60;
          RectBottom = height/2 + 60;
          DrawFocusRect(RectLeft, RectTop, RectRight, RectBottom, getResources().getColor(com.nep.R.color.white_color));
  }
  
  @Override
  public void surfaceCreated(SurfaceHolder holder) {
      mHolder = mSurfaceView.getHolder();
  }
  
  @Override
  public void surfaceDestroyed(SurfaceHolder holder) {
      try{
          if(mHolder!=null){
              mHolder.lockCanvas();
              canvas = null;
              mHolder.addCallback(null);
              mHolder = null;
          }
      }catch(Exception e){
          e.printStackTrace();
      }
  }
  
   private void DrawFocusRect(float RectLeft, float RectTop, float RectRight, float RectBottom, int color){
           try {
                  if(canvas!=null){
                      mHolder.lockCanvas();
                  }
                  else{
                      canvas = mHolder.lockCanvas();
                  }
                  canvas.drawColor(0,Mode.CLEAR);
                  paint = new Paint();
                  FontMetrics fm = new FontMetrics();
                  Paint paint2 = new Paint();
                  paint2.setColor(Color.WHITE);
                  paint2.setTextSize(30);
                  paint2.setTextAlign(Paint.Align.CENTER);
                  paint2.getFontMetrics(fm);  
                  canvas.drawText("Building", RectLeft+60, RectTop+60, paint2);
                  paint.setStyle(Paint.Style.STROKE);
                  paint.setColor(color);
                  paint.setStrokeWidth(3);
                  canvas.drawRect(RectLeft, RectTop, RectRight, RectBottom, paint);
                  mHolder.unlockCanvasAndPost(canvas);
          } catch (Exception e) {
              e.printStackTrace();
          }
      }
        public void createFIle(){
      try {
          DrawFocusRect(RectLeft, RectTop, RectRight, RectBottom, getResources().getColor(com.nep.R.color.white_color));
           Bitmap b = Bitmap.createBitmap(mSurfaceView.getWidth(), mSurfaceView.getHeight(), Bitmap.Config.ARGB_8888); 
           Canvas c = new Canvas(b);
           mSurfaceView.draw(c);
  
      //  Bitmap bmp = getBitmapFromView(frame);
  
          String mFile = mPath+"_layout011.png";
          File directory = new File (mFile);
          directory.createNewFile();
          OutputStream fo = new FileOutputStream(directory);
          ByteArrayOutputStream os = new ByteArrayOutputStream();
  
          b.compress(CompressFormat.JPEG, 100, os);
          os.writeTo(fo);
          fo.close();
          os.close();
      //  mSurfaceView.destroyDrawingCache();
          BasicMethods.showToast("Saved at - "+mFile, mContext);
      } catch (Exception e) {
          e.printStackTrace();
      }
  }
  }
  </code></pre>
  
  <p>i have user this code and it is not working,so i put my surface view inside other view and try to capture bitmap from that i was previously posted.i have try both way but not geting any solution.</p>