title: Android App - How to save a bitmap drawing on canvas as image? Check code?
body: <p>I tried to use the following codes to </p>
  
  <ol>
  <li>Draw on canvas</li>
  <li>Save the canvas on Image</li>
  </ol>
  
  <p><em>Problem - When I try to save the image, it shows a null pointer error and nothing is saved.</em></p>
  
  <p>Please help me to find the problem with the code or suggest me an alternative, which does excatly the same. Thanks in advance.</p>
  
  <p>Code to draw on canvas:</p>
  
  <pre><code>package com.example.draw2;
  
  import android.content.Context;
  import android.graphics.Bitmap;
  import android.graphics.Canvas;
  import android.graphics.Color;
  import android.graphics.Paint;
  import android.graphics.Path;
  import android.util.AttributeSet;
  import android.view.MotionEvent;
  import android.view.View;
  
  public class MyDrawView extends View {
      private Bitmap  mBitmap;
      private Canvas  mCanvas;
      private Path    mPath;
      private Paint   mBitmapPaint;
      private Paint   mPaint;
  
      public MyDrawView(Context c, AttributeSet attrs) {
          super(c, attrs);
  
          mPath = new Path();
          mBitmapPaint = new Paint(Paint.DITHER_FLAG);
  
          mPaint = new Paint();
          mPaint.setAntiAlias(true);
          mPaint.setDither(true);
          mPaint.setColor(0xFF000000);
          mPaint.setStyle(Paint.Style.STROKE);
          mPaint.setStrokeJoin(Paint.Join.ROUND);
          mPaint.setStrokeCap(Paint.Cap.ROUND);
          mPaint.setStrokeWidth(9);
      }
  
  
      @Override
      protected void onSizeChanged(int w, int h, int oldw, int oldh) {
          super.onSizeChanged(w, h, oldw, oldh);
          mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
          mCanvas = new Canvas(mBitmap);
      }
  
      @Override
      protected void onDraw(Canvas canvas) {
          canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
  
          canvas.drawPath(mPath, mPaint);
  
  
      }
  
      private float mX, mY;
      private static final float TOUCH_TOLERANCE = 4;
  
      private void touch_start(float x, float y) {
          mPath.reset();
          mPath.moveTo(x, y);
          mX = x;
          mY = y;
      }
      private void touch_move(float x, float y) {
          float dx = Math.abs(x - mX);
          float dy = Math.abs(y - mY);
          if (dx &gt;= TOUCH_TOLERANCE || dy &gt;= TOUCH_TOLERANCE) {
              mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2);
              mX = x;
              mY = y;
          }
      }
      private void touch_up() {
          mPath.lineTo(mX, mY);
          // commit the path to our offscreen
          mCanvas.drawPath(mPath, mPaint);
          // kill this so we don't double draw
          mPath.reset();
      }
  
      @Override
      public boolean onTouchEvent(MotionEvent event) {
          float x = event.getX();
          float y = event.getY();
  
          switch (event.getAction()) {
              case MotionEvent.ACTION_DOWN:
                  touch_start(x, y);
                  invalidate();
                  break;
              case MotionEvent.ACTION_MOVE:
                  touch_move(x, y);
                  invalidate();
                  break;
              case MotionEvent.ACTION_UP:
                  touch_up();
                  invalidate();
                  break;
          }
          return true;
      }
  
      public Bitmap getBitmap()
      {
      return mBitmap;
      }
  
  
  
      public void clear(){
          mBitmap.eraseColor(Color.GREEN);
          invalidate();
          System.gc();
  
      }
  
  }
  </code></pre>
  
  <p>Second code to save the canvas as image is in main activity.</p>
  
  <p>I tried a few things and some part of the code is commented.</p>
  
  <p>Since I am a beginner, I appreciate any advice </p>
  
  <p>Second code MainActivity:</p>
  
  <pre><code>package com.example.draw2;
  
  import java.io.File;
  import java.io.FileNotFoundException;
  import java.io.FileOutputStream;
  import java.io.IOException;
  
  import android.app.Activity;
  import android.graphics.Bitmap;
  import android.os.Bundle;
  import android.os.Environment;
  import android.view.Menu;
  import android.view.View;
  import android.widget.Button;
  import android.widget.Toast;
  
  
  public class MainActivity extends Activity 
  {
      MyDrawView myDrawView;
  
  
      @Override
      protected void onCreate(Bundle savedInstanceState) 
      {
  
          super.onCreate(savedInstanceState);
          myDrawView = new MyDrawView(this, null);
          setContentView(R.layout.activity_main);
  
          Button button1 = (Button)findViewById(R.id.button1);    
          button1.setOnClickListener(new View.OnClickListener() 
          {
              public void onClick(View v)
              {       
                  //View content = myDrawView;
  
                  //System.out.println(content);
  
  
                  //Bitmap bitmap = content.getDrawingCache();
  
                  File folder = new File(Environment.getExternalStorageDirectory().toString());
                   boolean success = false;
                   if (!folder.exists()) 
                   {
                       success = folder.mkdirs();
                   }
  
                   System.out.println(success+"folder");
  
                   File file = new File(Environment.getExternalStorageDirectory().toString() + "/sample.JPEG");
  
               if ( !file.exists() )
               {
                     try {
                      success = file.createNewFile();
                  } catch (IOException e) {
                      e.printStackTrace();
                  }
               }
  
               System.out.println(success+"file");
  
  
  
               FileOutputStream ostream = null;
                  try
                  {
                  ostream = new FileOutputStream(file);
  
                  System.out.println(ostream);
  
                  Bitmap save = myDrawView.getBitmap();
                  if(save == null) {
                      System.out.println("NULL bitmap save\n");
                  }
                  save.compress(Bitmap.CompressFormat.PNG, 100, ostream);
                  //bitmap.compress(Bitmap.CompressFormat.PNG, 100, ostream);
                     ostream.flush();
                      ostream.close();
                  }catch (NullPointerException e) 
                  {
                      e.printStackTrace();
                      Toast.makeText(getApplicationContext(), "Null error", Toast.LENGTH_SHORT).show();
                  }
  
                  catch (FileNotFoundException e) 
                  {
                      e.printStackTrace();
                      Toast.makeText(getApplicationContext(), "File error", Toast.LENGTH_SHORT).show();
                  }
  
                  catch (IOException e) 
                  {
                      e.printStackTrace();
                      Toast.makeText(getApplicationContext(), "IO error", Toast.LENGTH_SHORT).show();
                  }
  
              }
          });
  
      }
  
  
      @Override
      public boolean onCreateOptionsMenu(Menu menu) {
          // Inflate the menu; this adds items to the action bar if it is present.
          getMenuInflater().inflate(R.menu.main, menu);
          return true;
      }
  }
  </code></pre>