2011-10-15 45 views
2

嗨我已創建一個面板和簽名可以繪製在面板上。當我點擊保存按鈕簽名必須保存在一個文件中。我已經嘗試過以下編碼,但無法保存文件。我是在logcat中獲得異常。如何在android中保存簽名?

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 < 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 < dirtyRect.left) { 
       dirtyRect.left = historicalX; 
      } else if (historicalX > dirtyRect.right) { 
       dirtyRect.right = historicalX; 
      } 

      if (historicalY < dirtyRect.top) { 
       dirtyRect.top = historicalY; 
      } else if (historicalY > 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); 
     } 
    } 
} 
+0

您可以發佈從logcat的例外呢? – spatulamania

+0

java.io.FileNotFoundException:/mnt/sdcard/external_dir/1.png(沒有這樣的文件或目錄)。我得到這個異常。 – user977808

+0

哪一行或哪段代碼引發此異常? – spatulamania

回答