Deja de guardar fotos con la cámara nativa de Android

Estoy usando una cámara Android nativa y guardo el archivo en la carpeta de datos de mi aplicación (/mnt/sdcard/Android/data/com.company.app/files/Pictures/). Al mismo tiempo, una copia de la foto se guarda en la carpeta DCIM.

Este es mi código:

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); String formattedImageName = getDateString() + ".jpg"; File image_file = new File(this.getExternalFilesDir(Environment.DIRECTORY_PICTURES), formattedImageName); Uri imageUri = Uri.fromFile(image_file); intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri); startActivityForResult(intent, REQUEST_FROM_CAMERA); 

¿Cómo puedo evitar guardar una copia adicional de la imagen en la carpeta DCIM?

Muchas gracias

revisa este código …

 private void FillPhotoList() { // initialize the list! GalleryList.clear(); String[] projection = { MediaStore.Images.ImageColumns.DISPLAY_NAME }; for(int i=0;i 

y aquí es donde el método está haciendo toda la magia

  /** Method will check all the photo is the gallery and delete last captured and move it to the required folder. */ public void movingCapturedImageFromDCIMtoMerchandising() { // This is ##### ridiculous. Some versions of Android save // to the MediaStore as well. Not sure why! We don't know what // name Android will give either, so we get to search for this // manually and remove it. String[] projection = { MediaStore.Images.ImageColumns.SIZE, MediaStore.Images.ImageColumns.DISPLAY_NAME, MediaStore.Images.ImageColumns.DATA, BaseColumns._ID,}; // intialize the Uri and the Cursor, and the current expected size. for(int i=0;i 0)) { //****u is the place from data will come and projection is the specified data what we want c = managedQuery(u, projection, null, null, null); } // If we found the cursor and found a record in it (we also have the size). if ((c != null) && (c.moveToFirst())) { do { // Check each area in the gallery we built before. boolean bFound = false; for (String sGallery : GalleryList) { if (sGallery.equalsIgnoreCase(c.getString(1))) { bFound = true; Log.i("InfoLog","c.getString(1) "+c.getString(1)); break; } } // To here we looped the full gallery. if (!bFound) //the file which is newly created and it has to be deleted from the gallery { // This is the NEW image. If the size is bigger, copy it. // Then delete it! File f = new File(c.getString(2)); // Ensure it's there, check size, and delete! if ((f.exists()) && (CurrentFile.length() < c.getLong(0)) && (CurrentFile.delete())) { // Finally we can stop the copy. try { CurrentFile.createNewFile(); FileChannel source = null; FileChannel destination = null; try { source = new FileInputStream(f).getChannel(); destination = new FileOutputStream(CurrentFile).getChannel(); destination.transferFrom(source, 0, source.size()); } finally { if (source != null) { source.close(); } if (destination != null) { destination.close(); } } } catch (IOException e) { // Could not copy the file over. ToastMaker.makeToast(this, "Error Occured", 0); } } //****deleting the file which is in the gallery Log.i(INFOLOG,"imagePreORNext1 "+imagePreORNext); Handler handler = new Handler(); //handler.postDelayed(runnable,300); Log.i(INFOLOG,"imagePreORNext2 "+imagePreORNext); ContentResolver cr = getContentResolver(); cr.delete(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, BaseColumns._ID + "=" + c.getString(3), null); break; } } while (c.moveToNext()); } } } 

Puede usar lo siguiente: Primero obtenemos la última imagen guardada al verificar cuál fue la última imagen modificada. Luego verifique si la última hora de modificación está en los últimos segundos. También es posible que deba verificar la ubicación exacta donde la cámara almacena la imagen.

 private boolean deleteLastFromDCIM() { boolean success = false; try { File[] images = new File(Environment.getExternalStorageDirectory() + File.separator + "DCIM/Camera").listFiles(); File latestSavedImage = images[0]; for (int i = 1; i < images.length; ++i) { if (images[i].lastModified() > latestSavedImage.lastModified()) { latestSavedImage = images[i]; } } // OR JUST Use success = latestSavedImage.delete(); success = new File(Environment.getExternalStorageDirectory() + File.separator + "DCIM/Camera/" + latestSavedImage.getAbsoluteFile()).delete(); return success; } catch (Exception e) { e.printStackTrace(); return success; } } 

Desafortunadamente, algunos teléfonos inteligentes guardan imágenes en otra carpeta, como DCIM / 100MEDIA. Entonces no puedo confiar en estas soluciones. Prefiero usar de esta manera:

 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 = managedQuery( MediaStore.Images.Media.EXTERNAL_CONTENT_URI,projection, null, null, MediaStore.Images.ImageColumns.DATE_TAKEN + " DESC"); if(cursor != null){ cursor.moveToFirst(); // you will find the last taken picture here and can delete that } 

Intenté averiguar si existe una segunda copia y eliminé la copia. Usé el código anterior para encontrar la última foto tomada.

Aviso: No use cursor.close(); después de usar managedQuery , deje el cursor para que el sistema Android lo administre y no lo llame. Puede ver managedQuery ()

Aviso 2: el método managedQuery está en desuso y debe evitarse, implemente CursorLoaders en su lugar.

Una buena solución de Parth. Pero es bueno para los Samsung que guardan imágenes en DCIM / Cámara. Algunos teléfonos: los Sony Ericsson, los HTC los guardan en carpetas como DCIM / 100MEDIA, DCIM / 100ANDRO, así que modifiqué ligeramente el código:

  private boolean deleteLastFromDCIM() { boolean success = false; try { //Samsungs: File folder = new File(Environment.getExternalStorageDirectory() + File.separator + "DCIM/Camera"); if(!folder.exists()){ //other phones: File[] subfolders = new File(Environment.getExternalStorageDirectory() + File.separator + "DCIM").listFiles(); for(File subfolder : subfolders){ if(subfolder.getAbsolutePath().contains("100")){ folder = subfolder; break; } } if(!folder.exists()) return false; } File[] images = folder.listFiles(); File latestSavedImage = images[0]; for (int i = 1; i < images.length; ++i) { if (images[i].lastModified() > latestSavedImage.lastModified()) { latestSavedImage = images[i]; } } success = latestSavedImage.delete(); return success; } catch (Exception e) { e.printStackTrace(); return success; } } 

Estoy encontrando un problema similar con Moto Z Force (7.1.1). Tengo el MediaStore.EXTRA_OUTPUT definido en el bash, pero aún se crea un archivo duplicado en el directorio de la cámara.

Necesito probar en otros dispositivos, pero este es un enfoque que tomé con respecto a este tema. En lugar de tratar de encontrar el directorio específico de la cámara, estoy usando la ubicación MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME .

Aquí está mi fragmento de código:

 private void removeCameraDuplicate() { String[] proj = { MediaStore.Images.ImageColumns.DATA, MediaStore.Images.ImageColumns._ID }; String selection = MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME + " = ? "; String[] selectionArgs = new String[] { "Camera" }; Cursor cursor = mActivity.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, proj, selection, selectionArgs, MediaStore.Images.ImageColumns.DATE_TAKEN + " desc"); if (cursor != null) { int idxPath = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); if (cursor.getCount() > 0 && idxPath > -1 && cursor.moveToFirst()) { File original = new File(mMediaPath); File cameraDupe = new File(cursor.getString(idxPath)); if (original.exists() && cameraDupe.exists()) { LogUtils.LOGE("***> camera", "original " + original.length()); LogUtils.LOGE("***> camera", "original " + original.lastModified()); LogUtils.LOGE("***> camera", "duplicate " + cameraDupe.length()); LogUtils.LOGE("***> camera", "duplicate " + cameraDupe.lastModified()); if (original.length() == cameraDupe.length() && original.lastModified() == cameraDupe.lastModified()) { if (cameraDupe.delete()) { LogUtils.LOGE("***> camera", "duplicate deleted"); } } } } cursor.close(); } }