2017-08-01 121 views
0

因此,我本質上試圖做的是收集用戶的信息,然後收集他/她的簽名,然後將其附加到電子郵件。如何修復文件存儲路徑

String pilot, ship, to, from, zone1, zone2, CallSign, agent, date, imgPath; 
Toolbar toolbar; 
Button btn_get_sign, mClear, mGetSign, mCancel, btn_send; 
double vesselUnit; 
Dialog dialog; 
File file; 
LinearLayout mContent; 
View view; 
signature mSignature; 
Bitmap bitmap; 


File fileDIRECTORY = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + "/extSdCard" + "/DigitalSign"); 
String DIRECTORY= Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString() + "/extSdCard" + "/DigitalSign"; 
String rootpic_name = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date()); 
String pic_name = rootpic_name + ".JPEG"; 
String StoredPath = DIRECTORY + File.separator + rootpic_name + ".JPEG"; 




@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_digital_signature); 
    Bundle extras = getIntent().getExtras(); 
    if (extras != null) { 
     pilot = extras.getString("Pilot"); 
     ship = extras.getString("ship"); 
     to = extras.getString("to"); 
     from = extras.getString("from"); 
     zone1 = extras.getString("zone1"); 
     zone2 = extras.getString("zone2"); 
     CallSign = extras.getString("callsign"); 
     agent = extras.getString("agent"); 
     vesselUnit = extras.getDouble("vesselunits"); 
     date = extras.getString("date"); 
    } 
    // Setting ToolBar as ActionBar 
    toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    // Button to open signature panel 
    btn_get_sign = (Button) findViewById(R.id.signature); 
    btn_send= (Button) findViewById(R.id.btn_send); 
    // Method to create Directory, if the Directory doesn't exists 

    dialog = new Dialog(this); 
    // Removing the features of Normal Dialogs 
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 
    dialog.setContentView(R.layout.dialog_sig); 
    dialog.setCancelable(true); 

    btn_get_sign.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      // Function call for Digital Signature 
      dialog_action(); 

     } 
    }); 
    btn_send.setOnClickListener(new OnClickListener() { 
     public void onClick(View v){ 

      Uri upath = Uri.parse("file://" + StoredPath); 
      Intent emailIntent = new Intent(Intent.ACTION_SEND); 
      emailIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
      emailIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 
      emailIntent.putExtra(Intent.EXTRA_TEXT, "Pilot: "+pilot+"\nShip: "+ship+"\n"+"Destination: "+to+"\n"+"Departure location: "+from+"\n"+"Zone 1: "+zone1+"\n"+"Zone 2: "+zone2+"\n"+"Callsign: "+CallSign+"\n"+"Angent: "+agent+"\n"+"Vessel Units: "+vesselUnit); 
      // set the type to 'email' 
      emailIntent.setType("image/*"); 
      String to[] = {"[email protected]"}; 
      emailIntent.putExtra(Intent.EXTRA_EMAIL, to); 
      // the attachment 
      emailIntent.putExtra(Intent.EXTRA_STREAM, upath); 
      Log.d("TAG","Tagged"); 
      // the mail subject 
      emailIntent.putExtra(Intent.EXTRA_SUBJECT, pilot+"'s Ticket for "+ship); 


      startActivity(Intent.createChooser(emailIntent , "Send email...")); 
     } 
    }); 
} 

// Function for Digital Signature 
public void dialog_action() { 

    mContent = (LinearLayout) dialog.findViewById(R.id.linearLayout); 
    mSignature = new signature(getApplicationContext(), null); 
    mSignature.setBackgroundColor(Color.WHITE); 
    // Dynamically generating Layout through java code 
    mContent.addView(mSignature, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); 
    mClear = (Button) dialog.findViewById(R.id.clear); 
    mGetSign = (Button) dialog.findViewById(R.id.getsign); 
    mGetSign.setEnabled(false); 
    mCancel = (Button) dialog.findViewById(R.id.cancel); 
    view = mContent; 

    mClear.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      Log.v("tag", "Panel Cleared"); 
      mSignature.clear(); 
      mGetSign.setEnabled(false); 
     } 
    }); 
    mGetSign.setOnClickListener(new View.OnClickListener() { 

     public void onClick(View v) { 

      Log.v("tag", "Panel Saved"); 
      view.setDrawingCacheEnabled(true); 
      if(isExternalStorageReadable() && isExternalStorageWritable()) { 
       file=mSignature.save(view); 
       dialog.dismiss(); 
       Toast.makeText(getApplicationContext(), "Saved", Toast.LENGTH_SHORT).show(); 
       // Calling the same class 
       recreate(); 
      } 
      else{Toast.makeText(getApplicationContext(), "NOT Saved", Toast.LENGTH_SHORT).show();} 
     } 
    }); 
    mCancel.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      Log.v("tag", "Panel Cancelled"); 
      dialog.dismiss(); 
      // Calling the same class 
      recreate(); 
     } 
    }); 
    dialog.show(); 
} 


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.BLACK); 
     paint.setStyle(Paint.Style.STROKE); 
     paint.setStrokeJoin(Paint.Join.ROUND); 
     paint.setStrokeWidth(STROKE_WIDTH); 
    } 

    public File save(View v) { 
     Log.v("tag", "Width: " + v.getWidth()); 
     Log.v("tag", "Height: " + v.getHeight()); 
     if (bitmap == null) { 
      bitmap = Bitmap.createBitmap(mContent.getWidth(), mContent.getHeight(), Bitmap.Config.RGB_565); 
     } 
     Canvas canvas = new Canvas(bitmap); 
     fileDIRECTORY.mkdirs(); 
     File nfile = new File (fileDIRECTORY,pic_name); 
     try { 
      // Output the file 
      FileOutputStream mFileOutStream = new FileOutputStream(nfile); 
      v.draw(canvas); 
      // Convert the output file to Image such as .png 
      bitmap.compress(Bitmap.CompressFormat.JPEG, 100, mFileOutStream); 
      mFileOutStream.flush(); 
      mFileOutStream.close(); 
      MediaScannerConnection.scanFile(getApplicationContext(), new String[] { nfile.toString() }, null, 
        new MediaScannerConnection.OnScanCompletedListener() { 
         public void onScanCompleted(String path, Uri uri) { 
          Log.i("ExternalStorage", "Scanned " + path + ":"); 
          Log.i("ExternalStorage", "-> uri=" + uri); 
         } 
        }); 


     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return nfile; 
    } 

    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(); 
     mGetSign.setEnabled(true); 

     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) { 
     Log.v("log_tag", 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); 
    } 
} 
/* Checks if external storage is available for read and write */ 
public boolean isExternalStorageWritable() { 
    String state = Environment.getExternalStorageState(); 
    if (Environment.MEDIA_MOUNTED.equals(state)) 
    { 
     Log.d("TRACE","ISWRITEABLE"); 
     return true; 
    } 
    return false; 
} 

/* Checks if external storage is available to at least read */ 
public boolean isExternalStorageReadable() { 
    String state = Environment.getExternalStorageState(); 
    if (Environment.MEDIA_MOUNTED.equals(state) || Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) 
    { 
     Log.d("TRACE","ISREADABLE"); 
     return true; 
    } 
    return false; 
} 
public static void addImageToGallery(final String filePath, final Context context) { 

    ContentValues values = new ContentValues(); 

    values.put(Images.Media.DATE_TAKEN, System.currentTimeMillis()); 
    values.put(Images.Media.MIME_TYPE, "image/jpeg"); 
    values.put(MediaStore.MediaColumns.DATA, filePath); 
    try{ 
     context.getContentResolver().insert(Images.Media.EXTERNAL_CONTENT_URI, values); 
    }catch(Exception e){ 
     Log.d("TAG","Not Saved in gallery"); 
    } 

} 

}

所以我創建了目錄,但圖片是不重視和不顯示在文件目錄了。我沒有看到我的問題是從哪裏來的,但我肯定知道這張圖片要麼沒有被處理,要麼沒有被正確保存在文件中。

+0

你是否有文件中又名'/存儲你的文件路徑/模擬/ 0 /圖片/ DigitalSign/imagename'? –

+0

如果您仍然需要幫助,請提供[mcve]。特別是,任何人都應該能夠複製並粘貼代碼並按照您提供的**完全編譯**。就個人而言,我不介意添加一些進口聲明。但是,我不能開始猜測你在這裏給出的代碼是什麼方法和類。特別是對於Android編程,這非常重要,因爲它顯示了代碼在生命週期中的執行位置。 –

+0

@ Code-Apprentice好吧我把全部代碼加起來 –

回答

1

我建議你先了解android存儲模型。
還有很多困惑當我們談論android的內部和外部存儲。 這主要是因爲。

我們認爲:

我們的外部存儲的理解是SD卡,這是不完全正確。

什麼Android SDK認爲:

每一個Android兼容設備支持共享「外部存儲」,你可以用它來保存文件。這可以是可移動存儲介質(如SD卡)或內部(不可移動)存儲器。保存到外部存儲的文件是世界可讀的,並且可以在用戶啓用USB大容量存儲器在計算機上傳輸文件時進行修改。

這裏是一個很好的來源,以瞭解更多關於 Internal StorageExternal Storage

編輯:沒有嘗試硬編碼的路徑,當你正在開發一個應用程序的多個製造商,因爲它從一個製造商的不同而不同。

0

更改您的路徑目錄

File DIRECTORY = new File(Environment.getExternalStorageDirectory() 
        .getParent() + "/extSdCard" + "/DigitalSign"); 

登錄

/存儲/模擬/ extSdCard/DigitalSign

+0

這仍然改變路徑目錄到/ storage/emulated/extSdCard/DigitalSign但它仍然不會附加到電子郵件,所以現在我不知道這個問題來自 –

+0

DigitalSign,文件夾包含電子郵件的權利? 然後嘗試更改StoredPath至DIRECTORY Uri upath = Uri。解析(「file://」+ StoredPath); –

+0

仍然沒有附加,我厭倦了Uri.parse(「file://」+ DIRECTORY)和字符串版本的字符串Uri.parse(「file://」+ dir) –