2017-10-09 122 views
1

我工作的一個項目,該項目採取的照片從用戶然後做一些image processing。 ,我使用此代碼來捕獲用戶的照片:如何防止android相機意圖保存拍攝的圖像兩次?

private static final int TAKE_PICTURE = 1; 
private Uri imageUri; 

public void takePhoto(View view) { 
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    File photo = new File(Environment.getExternalStorageDirectory()+"/glasses/", "temp.png"); 
    intent.putExtra(MediaStore.EXTRA_OUTPUT, 
      Uri.fromFile(photo)); 
    imageUri = Uri.fromFile(photo); 
    startActivityForResult(intent, TAKE_PICTURE); 
} 

,它工作正常,但問題是照片中有兩個不同的目錄被保存兩次:

  1. /存儲/模擬/ 0/DCIM /相機
  2. /存儲/模擬/ 0 /眼鏡

如何防止相機從意向保存拍攝的圖像的相機基本目錄?

在此先感謝。

+0

因爲您正在將圖片保存在您的代碼中。 –

+0

@MuhammadTufail是的,我保存圖像做一些圖像處理,我想保存在一個目錄! –

+0

一個目錄是指哪個目錄? – Champandorid

回答

0

有你必須從默認位置刪除最後拍攝的照片一個選項:

我想這可能是幫助你: -

private void deleteLastPhotoFromGallery() { 

     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(); 
} 
} 
} 
+0

感謝Champandorid的回答,偉大的想法,但兩個問題 1文件不會被刪除 2 - 爲什麼從第一個到庫保存的,如果我救了它在目錄 –

+0

只是因爲首先相機保存該圖像到默認的目錄,然後眼鏡您的自定義目錄。 – Champandorid

+0

好吧謝謝,但是當我嘗試你的代碼,它似乎圖像被刪除,但不刪除它顯示黑色的照片,而不是 –

0

這裏是從刪除最新的圖像的代碼DCIM文件夾

private void deleteLatest() { 
    File f = new File(Environment.getExternalStorageDirectory() + "/DCIM/Camera"); 

    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; 
      } 
     } 

    }); 
    files[0].delete(); 

} 
+0

感謝您的回答,但與@Champandorid一樣製作新的黑色圖像 –

0

您不應該刪除任何內容。這是適得其反的。

您的代碼現在可以執行以下操作: - 您將相機應用程序與相機應用程序一起保存照片應用程序的小型副本,同時將大型副本保存到相機文件夾本身。

你需要改變你的代碼,使相機的應用程序保存到您的烏里全尺寸圖像不保存圖像本身。

這是通過:

intent.setClipData(imageUri); 

intent.setFlags (Intent.FLAG_GRANT_URI_READ_PERMISSION | Intent.FLAG_GRANT_URI_WRITE_PERMISDION); 

,不要使用:

intent.putExtra(...) 

有可能是,如果你使用Android 6.0或更高版本,你可能會面臨另一個問題:相機應用將引發SecurityException嘗試將圖像寫入您的imageUri。在這種情況下,你需要使用FileProvider

0

沒有辦法保證任何當你調用ACTION_IMAGE_CAPTURE。我的意思是,你無法知道哪個應用程序會開始,並且它可能不是100%兼容的,或者是有問題的,或者是有意的。

用戶可以自由使用其設備上預裝的相機應用程序(並且大多數ODM選擇提供其定製應用程序),或從Play商店下載另一個相機應用程序或將其下載。即使該應用符合所有規格,它也有權將捕獲的文件存儲在設備上的任何位置或多個位置 - 這僅取決於應用所具有的系統權限。

底線是,your deleted answer to yourself是正確的。如果您想更好地控制設備攝像頭,那麼捆綁您的自定義攝像頭實施是值得的。您可以依賴開源庫(例如https://android-arsenal.com/tag/141)開始。

相關問題