title: how to save signature in android?
body: <p>Hi I have created a panel and signature can be drawn on the panel.When I click on the save button the signature has to be saved in a file.I have tried with the following coding but could not save the file.I am getting exception in logcat.</p>
  
  <pre><code>public class Signatures_saveActivity extends Activity {
  
      LinearLayout mContent;
      signature mSignature;
      Button mClear, mGetSign;
      public static String tempDir;
      public int count = 1;
      public String current = null;
      private Bitmap mBitmap;
      View mView;
      String ss;
  
      @Override
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.main);
  
          tempDir = Environment.getExternalStorageDirectory() + "/"
                  + getResources().getString(R.string.external_dir) + "/";
          prepareDirectory();
          current = count + ".png";
  
          mContent = (LinearLayout) findViewById(R.id.linearLayout);
          mSignature = new signature(this, null);
          mSignature.setBackgroundColor(Color.BLUE);
          mContent.addView(mSignature, LayoutParams.FILL_PARENT,
                  LayoutParams.FILL_PARENT);
          mClear = (Button) findViewById(R.id.clear);
          mGetSign = (Button) findViewById(R.id.getsign);
          mView = mContent;
  
          mClear.setOnClickListener(new OnClickListener() {
              public void onClick(View v) {
                  Log.v("log_tag", "Panel Cleared");
                  mSignature.clear();
              }
          });
  
          mGetSign.setOnClickListener(new OnClickListener() {
              public void onClick(View v) {
                  Log.v("log_tag", "Panel Saved");
                  mView.setDrawingCacheEnabled(true);
                  mSignature.save(mView);
  
              }
          });
  
      }
  
      private boolean prepareDirectory() {
          try {
              if (makedirs()) {
                  return true;
              } else {
                  return false;
              }
          } catch (Exception e) {
              e.printStackTrace();
              Toast.makeText(
                      this,
                      "Could not initiate File System.. Is Sdcard mounted properly?",
                      1000).show();
              return false;
          }
      }
  
      private boolean makedirs() {
          File tempdir = new File(tempDir);
          if (!tempdir.exists())
              tempdir.mkdirs();
  
          if (tempdir.isDirectory()) {
              File[] files = tempdir.listFiles();
              for (File file : files) {
                  if (!file.delete()) {
                      System.out.println("Failed to delete " + file);
                  }
              }
          }
          return (tempdir.isDirectory());
      }
  
      public class signature extends View {
          private static final float STROKE_WIDTH = 5f;
          private static final float HALF_STROKE_WIDTH = STROKE_WIDTH / 2;
          private Paint paint = new Paint();
          private Path path = new Path();
  
          private float lastTouchX;
          private float lastTouchY;
          private final RectF dirtyRect = new RectF();
  
          public signature(Context context, AttributeSet attrs) {
              super(context, attrs);
              paint.setAntiAlias(true);
              paint.setColor(Color.YELLOW);
              paint.setStyle(Paint.Style.STROKE);
              paint.setStrokeJoin(Paint.Join.ROUND);
              paint.setStrokeWidth(STROKE_WIDTH);
          }
  
          public void save(View v) {
              Log.v("log_tag", "Width: " + v.getWidth());
              Log.v("log_tag", "Height: " + v.getHeight());
  
              if (mBitmap == null) {
                  mBitmap = Bitmap.createBitmap(320, 480, Bitmap.Config.RGB_565);
              }
              Canvas canvas = new Canvas(mBitmap);
              String FtoSave = tempDir + current;
              File file = new File(FtoSave);
              try {
                  FileOutputStream mFileOutStream = new FileOutputStream(file);
                  v.draw(canvas);
                  mBitmap.compress(Bitmap.CompressFormat.PNG, 90, mFileOutStream);
  
                  // Bitmap bmp = intent.getExtras().get("data");
  //              ByteArrayOutputStream stream = new ByteArrayOutputStream();
  //              mBitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
  //              byte[] val = stream.toByteArray();
  //                String s = new String(val.toString());
  //              
  //               ss = Base64.encodeToString(val, Base64.DEFAULT);
  //               System.out.println("String image data" + ss);
  
                  mFileOutStream.flush();
                  mFileOutStream.close();
                  String url = Images.Media.insertImage(getContentResolver(),
                          mBitmap, "title", null);
                  Log.v("log_tag", "url" + url);
  
              } catch (Exception e) {
                  Log.v("log_tag", e.toString());
              }
          }
  
          public void clear() {
              path.reset();
              invalidate();
          }
  
          @Override
          protected void onDraw(Canvas canvas) {
              canvas.drawPath(path, paint);
          }
  
          @Override
          public boolean onTouchEvent(MotionEvent event) {
              float eventX = event.getX();
              float eventY = event.getY();
  
              switch (event.getAction()) {
              case MotionEvent.ACTION_DOWN:
                  path.moveTo(eventX, eventY);
                  lastTouchX = eventX;
                  lastTouchY = eventY;
                  return true;
  
              case MotionEvent.ACTION_MOVE:
  
              case MotionEvent.ACTION_UP:
                  resetDirtyRect(eventX, eventY);
                  int historySize = event.getHistorySize();
                  for (int i = 0; i &lt; historySize; i++) {
                      float historicalX = event.getHistoricalX(i);
                      float historicalY = event.getHistoricalY(i);
                      expandDirtyRect(historicalX, historicalY);
                      path.lineTo(historicalX, historicalY);
                  }
                  path.lineTo(eventX, eventY);
                  break;
  
              default:
                  debug("Ignored touch event: " + event.toString());
                  return false;
              }
  
              invalidate((int) (dirtyRect.left - HALF_STROKE_WIDTH),
                      (int) (dirtyRect.top - HALF_STROKE_WIDTH),
                      (int) (dirtyRect.right + HALF_STROKE_WIDTH),
                      (int) (dirtyRect.bottom + HALF_STROKE_WIDTH));
  
              lastTouchX = eventX;
              lastTouchY = eventY;
  
              return true;
          }
  
          private void debug(String string) {
          }
  
          private void expandDirtyRect(float historicalX, float historicalY) {
              if (historicalX &lt; dirtyRect.left) {
                  dirtyRect.left = historicalX;
              } else if (historicalX &gt; dirtyRect.right) {
                  dirtyRect.right = historicalX;
              }
  
              if (historicalY &lt; dirtyRect.top) {
                  dirtyRect.top = historicalY;
              } else if (historicalY &gt; dirtyRect.bottom) {
                  dirtyRect.bottom = historicalY;
              }
          }
  
          private void resetDirtyRect(float eventX, float eventY) {
              dirtyRect.left = Math.min(lastTouchX, eventX);
              dirtyRect.right = Math.max(lastTouchX, eventX);
              dirtyRect.top = Math.min(lastTouchY, eventY);
              dirtyRect.bottom = Math.max(lastTouchY, eventY);
          }
      }
  }
  </code></pre>