Estoy usando Android nativo de la cámara y guardar el archivo en mi carpeta de datos de aplicación (/mnt/sdcard/Android/data/com.de la empresa.app/archivos/Fotos/). Al mismo tiempo, la antera 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 que guardar copia adicional de la imagen a la carpeta DCIM?

Muchas Gracias

Hola chinthaka,a continuación el código FillPhotoList() recogerá toda la imagen en el gallary y de otro método movingCapturedImageFromDCIMtoMerchandising() va a ir a través de la arralist y encuentra la última imagen capturada y la elimine de la carpeta DCIM.

OriginalEl autor Chinthaka | 2011-11-10

5 Comentarios

  1. 4

    verificación de este código..

    private void FillPhotoList() {  
        //initialize the list!    
        GalleryList.clear();    
        String[] projection = { MediaStore.Images.ImageColumns.DISPLAY_NAME }; 
        for(int i=0;i<projection.length;i++)
            Log.i("InfoLog","projection "+projection[0].toString());
        //intialize the Uri and the Cursor, and the current expected size.    
        Cursor c = null;     
        Uri u = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; 
        Log.i("InfoLog","FillPhoto Uri u "+u.toString());
        //Query the Uri to get the data path.  Only if the Uri is valid.    
        if (u != null)    
        {       
            c = managedQuery(u, projection, null, null, null);    
        }     
        //If we found the cursor and found a record in it (we also have the id).    
        if ((c != null) && (c.moveToFirst()))     
        {       
            do        
            {         
                //Loop each and add to the list.         
                GalleryList.add(c.getString(0)); //adding all the images sotred in the mobile phone(Internal and SD card)
    
            }            
            while (c.moveToNext());    
        } 
        Log.i(INFOLOG,"gallery size "+ GalleryList.size());
    } 

    y aquí es donde el método es hacer 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<projection.length;i++)
    Log.i("InfoLog","on activityresult projection "+projection[i]);
    //+" "+projection[1]+" "+projection[2]+" "+projection[3] this will be needed if u remove the for loop
    Cursor c = null;          
    Uri u = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;       
    Log.i("InfoLog","on activityresult Uri u "+u.toString());
    if (CurrentFile != null)      
    {                          
    //Query the Uri to get the data path.  Only if the Uri is valid,     
    //and we had a valid size to be searching for.     
    if ((u != null) && (CurrentFile.length() > 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());   
    }         
    }       
    }
    Gracias por la respuesta. ¿Que podemos eliminar mediaStore antes de la sincronización con Picasa? ¿Conoces alguna forma de bancos de ahorro archivo mediaStroe?
    Puede usted por favor hágamelo saber lo que es este «CurrentFile»? ¿Dónde tengo que definir esto?
    es el nombre del archivo que se está dando a la imagen capturada
    Amol, es este trabajo? Porque al guardar duplicados de fotos que tiene su propio nombre de archivo. No podemos cambiar eso.
    Gracias Amol. por fin pude eliminar archivos de medios.

    OriginalEl autor School Boy

  2. 7

    Puede utilizar el siguiente :
    Primero debemos obtener la última imagen grabada por la comprobación de que era la última modificación de la imagen. A continuación, compruebe si la hora de la última modificación es en los últimos segundos. Usted también puede tener que comprobar la ubicación exacta de 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;
    }
    }
    Cualquier razón para votar ?
    Estoy pensando en lo que si la aplicación pasa a ser en un teléfono que no guarda las fotos a la carpeta «DCIM/Camera/» ¿no corre el riesgo de eliminar algunos de usuario pobre del álbum familiar?
    una solución a @ Sixtoo coment es chek tiempo: si el archivo tiene la última modificación par de segundos atrás – sólo, a continuación, elimínelo

    OriginalEl autor Parth mehta

  3. 6

    Por desgracia, algunos de los teléfonos inteligentes guardar las imágenes en otra carpeta como la carpeta DCIM/100MEDIA. Así que no se puede confiar a la solución. Yo 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
    }

    Traté de averiguar si una segunda copia que existe y eliminar la copia. He utilizado el código de arriba para encontrar la última imagen tomada.

    Aviso: no use cursor.close(); después de usar managedQuery, Deje el cursor para el sistema Android para gestionar y no le llamo. Usted puede ver managedQuery()

    Notice2: El managedQuery método está en desuso y debe evitarse, implementar CursorLoaders lugar.

    Super! Me salvó el día! Lo que es un bug en Android..
    CUIDADO:esto es muy peligroso.. en algunos dispositivos, las fotos que hacemos desde nuestra aplicación no está copiando a la galería. En ese caso, si queremos borrar la última imagen tomada, en su regreso a la foto tomada desde la aplicación de la cámara, así que se termina de eliminar el mal de la imagen, no la imagen tomada desde nuestra aplicación. Así, la línea de fondo es, borrar la última imagen tomada de la galería sólo para los dispositivos que crea la copia 2(e.g HTC One M8).
    ¿Cómo sabemos que la copia 2 se crea? Estoy frente a este problema en la Moto G4 Plus.
    de ninguna manera, si el uso de la cámara intención.. si usted no desea crear la copia 2, usted tiene que implementar Cámara API en su aplicación.

    OriginalEl autor NrNazifi

  4. 3

    Una buena solución por Parth. Pero es bueno para Samsungs que mantener las imágenes en la carpeta DCIM/Cámara. Algunos de los teléfonos de Sony Ericsson, Htc guardarlos en carpetas como DCIM/100MEDIA, DCIM/100ANDRO así que he modificado 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;
    }
    }
    Este no está haciendo nada para mí. Mi aplicación no se bloquee, pero la foto persiste. Podrías arrojar algo de luz a su uso?
    Esto no quitar la imagen para mí, pero en la Aplicación de la galería me dan un roto en miniatura donde la imagen fue.
    Usted sabe los chicos, que era una solución que trabajó en una situación particular en una determinada aplicación en particular los teléfonos. En el siempre cambiante (wild debo decir?) Mundo Android nada es constante no persistente. Además, no todos los carteles tiene tiempo para mantener sus respuestas hasta la fecha para cada dispositivo…

    OriginalEl autor Yar

  5. 0

    Estoy encontrando con un problema similar con la Moto Z de la Fuerza (7.1.1). Tengo el MediaStore.EXTRA_OUTPUT definido en la intención, pero un duplicado de archivos se crean en el directorio de la cámara.

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

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

    OriginalEl autor Kyle

Dejar respuesta

Please enter your comment!
Please enter your name here