2014-03-13 75 views
0

我正在開發一個Android應用程序。用戶可以在點擊按鈕後拍攝照片。這張相片將用下面的方法被保存到內部包存儲(數據/數據/包/ ...):Android防止在DCIM /公共文件夾上保存照片

private String saveToInternalSorage(Bitmap bitmapImage){ 
    ContextWrapper cw = new ContextWrapper(getApplicationContext()); 
    File directory = cw.getDir("TEST", Context.MODE_PRIVATE); 
    File pod = new File(directory, object.getTitle() + "" + 
object.getName() + "" + object.getAge() + ".jpg"); 

    FileOutputStream fos = null; 
    try {   

     fos = new FileOutputStream(pod); 
     bitmapImage.compress(Bitmap.CompressFormat.JPEG, 100, fos); 
     fos.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return pod.getAbsolutePath(); 
} 

另外it's可以刪除從該目錄畫面。這像一個魅力。在模擬器和固定電話上測試。但照片也保存到公用文件夾DCIM。我正在用HTC ONE mini進行測試(沒有SD卡?)。以下是顯示拍攝和獲取照片方法的代碼。

public void takePhoto() { 

    cameraintent = new Intent("android.media.action.IMAGE_CAPTURE"); 
    startActivityForResult(cameraintent, CAMERA_CAPTURE_IMAGE_REQUEST_CODE); 
} 

public void onActivityResult(int requestCode, int resultCode, Intent data) { 

    if (requestCode == CAMERA_CAPTURE_IMAGE_REQUEST_CODE) { 
     if (resultCode == Activity.RESULT_OK) { 

      Bundle extras = data.getExtras(); 
      Bitmap bmp = (Bitmap) extras.get("data"); 

      setPath(saveToInternalSorage(bmp)); 

我想防止在公用文件夾中存儲照片。我的方法刪除DCIM文件夾中的最新文件失敗,因爲getExternalStorageDirectory()給我一個模擬路徑(如emulated/sdcard/...)在HTC One迷你。而這絕對不是正確的道路。所以我怎麼能確定照片將只存儲到內部的包裝結構,而不是(沒有SD卡/ SD卡)在公用文件夾中。而當我必須刪除公共文件夾中的照片如何做到我得到正確的路徑(爲/在不同的設備上)?

我發現沒有解決方案來防止在公共文件夾「從頭」存儲。

在此先感謝!

編輯

下面的方法應該能夠刪除從DCIM /公用文件夾的照片。

private void deleteLatestFromDCIM() { 

    File f = new File(Environment.getExternalStorageDirectory() + ""); 

    File [] files = f.listFiles(); 

    Arrays.sort(files, new Comparator<Object>() 
      { 
     public int compare(Object o1, Object o2) { 

      if (((File)o1).lastModified() > ((File)o2).lastModified()) { 
        return -1; 
      } else if (((File)o1).lastModified() < ((File)o2).lastModified()) { 
        return 1; 
      } else { 
        return 0; 
      } 
      ... 
    if(files[0].exists()) 
    files[0].delete(); 

問題是DCIM /公共文件夾中的照片獲取通用名稱。請參見下面的圖片:

Photos in DCIM

那麼,如何刪除其名字我不「知道」的圖像?在內存中存儲照片效果很好!我不會讓他們進入公共文件夾。通過getExternalStorageDirectory()方法,我可以得到如上所述的仿真路徑。這真的是DCIM /公共文件夾的路徑嗎?

+0

檢查http://stackoverflow.com/questions/11878336/delete-copy-of-an-image-in-sdcard – zgc7009

+0

getExternalStorageDirectory(),在您的鏈接中提到,並沒有給我正確的路徑,如上所述以上。 – DehMotth

+0

Gotcha。你是否試圖通過仿真來看它是否有效。我知道這聽起來很奇怪,但如果我打開我的文件管理器,它會模擬一切,但如果我從文件管理器中刪除它,它會從我的內存中刪除。可能是類似的情況,不太確定。對不起,沒有真正閱讀我發佈的整個鏈接,只是看到它是沿着你的線條,並有一個解決方案。 – zgc7009

回答

0

我是否正確理解您想用相機拍照並將其存儲在內存中?然後,我有兩個建議:

  1. 你嘗試在 http://developer.android.com/training/camera/photobasics.html 與烏里填充MediaStore.EXTRA_OUTPUT內部儲存所描述的方法是什麼?

  2. 如果這無助於將圖像直接保存在內部存儲器中,爲什麼不直接從getExternalStorageDirectory()返回的模擬路徑中刪除它?據我所知,通過此路徑的文件訪問完美,儘管它可能只是一個鏈接。

+0

謝謝@JörgEisfeld。我已經更新了我的問題,以使事情更清楚。捕捉照片非常熟悉Android的API方法...希望有外面的幫助... – DehMotth

0

對不起,回答我的問題,希望這將是有益的其他開發人員: 我的策略:如問題描述拍攝照片,將它保存到內部存儲器(數據/數據/ com.package ...) 使用以下方法將其從公用文件夾(DCIM/MEDIA/100MEDIA)中刪除後(刪除該文件夾中最後一次拍攝的照片...):

private void deleteLastPhotoTaken() { 

    String[] projection = new String[] { 
      MediaStore.Images.ImageColumns._ID, 
      MediaStore.Images.ImageColumns.DATA, 
      MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME, 
      MediaStore.Images.ImageColumns.DATE_TAKEN, 
      MediaStore.Images.ImageColumns.MIME_TYPE }; 

    final Cursor cursor = getContentResolver().query(
      MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection, 
          null,null, MediaStore.Images.ImageColumns.DATE_TAKEN + " 
          DESC"); 

    if (cursor != null) { 
     cursor.moveToFirst(); 

     int column_index_data = 
        cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 

        String image_path = cursor.getString(column_index_data); 

     File file = new File(image_path); 
     if (file.exists()) { 
      file.delete(); 

正如在其他解決方案中提到的:不要關閉遊標! Android會爲你做到這一點。

相關問題