Eliminar una imagen de la galería después de la foto de intención de la cámara tomada


Sé que esto se ha preguntado de muchas maneras diferentes, pero todavía no puedo eliminar la imagen de la galería de la carpeta predeterminada. Estoy guardando el archivo en la tarjeta SD correctamente y puedo eliminar ese archivo bien, pero el archivo de imagen de galería predeterminado que se muestra debajo de la carpeta Cámara no se eliminará.

Me gustaría que la imagen se borre una vez que se devuelve la actividad, ya que el archivo ya está almacenado en la tarjeta SD en /Coupon2.

Alguna sugerencia?

public void startCamera() {
    Log.d("ANDRO_CAMERA", "Starting camera on the phone...");

    mManufacturerText = (EditText) findViewById(R.id.manufacturer);
    String ManufacturerText = mManufacturerText.getText().toString();
    String currentDateTimeString = new Date().toString();

    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    File filedir = new File(Environment.getExternalStorageDirectory()+"/Coupon2");
    filedir.mkdirs();

    File file = new File(Environment.getExternalStorageDirectory()+"/Coupon2", ManufacturerText+"-test.png");
    outputFileUri = Uri.fromFile(file);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);

    startActivityForResult(intent, CAMERA_PIC_REQUEST);
}

protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == CAMERA_PIC_REQUEST && resultCode == -1) {  
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.putExtra("crop", "true");
        intent.putExtra("scale", "true");

        intent.putExtra("return-data", false);
        intent.setDataAndType(outputFileUri, "image/*");
        intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
        startActivityForResult(intent, CAMERA_CROP_REQUEST);
    }else { 
        SetImage();
        saveState();
    }
}
Author: Sam, 2011-06-17

12 answers

Mi solicitud requiere que llame a una intención para tomar una foto. La foto no puede estar en la galería, sino que debe estar en un directorio específico en la tarjeta SD.

Originalmente solo usé el EXTRA_OUTPUT, pero pronto descubrí lo siguiente: - Algunos dispositivos lo utilizan completamente y omiten la galería. - Algunos dispositivos lo ignoran completamente y SOLO usan la galería. - Algunos dispositivos realmente chupar y guardar una imagen de tamaño completo a la galería, y guardar una miniatura solo a la ubicación I querer. (HTC sabes quién eres...)

Por lo tanto, no puedo borrar ciegamente un archivo de galería cuando haya terminado. La última foto agregada puede o no ser la que quiero eliminar. Además, es posible que tenga que copiar ese archivo reemplazando el mío después. Debido a que mi actividad es de 2000 líneas, y mi empresa no querría que todo nuestro código se publique, estoy publicando solo los métodos involucrados en hacer esto. Espero que esto ayude.

También, voy a decir, esta es mi primera aplicación para Android. Yo no estaría sorprendido si había una mejor manera de hacer esto que yo simplemente no sé, pero esto es lo que está funcionando para mí!

Entonces, aquí está mi solución:

Primero, en mi contexto de aplicación defino una variable de la siguiente manera:

public ArrayList<String> GalleryList = new ArrayList<String>();

A continuación, en mi actividad, defino un método para obtener una lista de todas las fotos en la galería:

private void FillPhotoList()
{
   // initialize the list!
   app.GalleryList.clear();
   String[] projection = { MediaStore.Images.ImageColumns.DISPLAY_NAME };
   // intialize the Uri and the Cursor, and the current expected size.
   Cursor c = null; 
   Uri u = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
   //
   // 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.
        app.GalleryList.add(c.getString(0));
      }     
      while (c.moveToNext());
   }
}

Aquí hay un método para devolver un nombre de archivo único para mi nueva imagen:

private String getTempFileString()
{
   // Only one time will we grab this location.
   final File path = new File(Environment.getExternalStorageDirectory(), 
         getString(getApplicationInfo().labelRes));
   //
   // If this does not exist, we can create it here.
   if (!path.exists())
   {
      path.mkdir();
   }
   //
   return new File(path, String.valueOf(System.currentTimeMillis()) + ".jpg").getPath();
}

Tengo tres variables en mi Actividad que almacenan información para mí sobre un archivo actual. Una cadena (ruta), una variable de archivo y un URI para ese archivo:

public static String sFilePath = ""; 
public static File CurrentFile = null;
public static Uri CurrentUri = null;

Nunca establezco estos directamente, solo llamo a un setter en la ruta del archivo:

public void setsFilePath(String value)
{
   // We just updated this value. Set the property first.
   sFilePath = value;
   //
   // initialize these two
   CurrentFile = null;
   CurrentUri = null;
   //
   // If we have something real, setup the file and the Uri.
   if (!sFilePath.equalsIgnoreCase(""))
   {
      CurrentFile = new File(sFilePath);
      CurrentUri = Uri.fromFile(CurrentFile);
   }
}

Ahora llamo a una intención a tomar una foto.

public void startCamera()
{
   Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
   // Specify the output. This will be unique.
   setsFilePath(getTempFileString());
   //
   intent.putExtra(MediaStore.EXTRA_OUTPUT, CurrentUri);
   //
   // Keep a list for afterwards
   FillPhotoList();
   //
   // finally start the intent and wait for a result.
   startActivityForResult(intent, IMAGE_CAPTURE);
}

Una vez hecho esto, y la actividad vuelve, aquí está mi código:

protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
   if (requestCode == IMAGE_CAPTURE)
   {
      // based on the result we either set the preview or show a quick toast splash.
      if (resultCode == RESULT_OK)
      {
         // 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.
         Cursor c = null; 
         Uri u = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
         //
         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))
            {
               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 gallary we built before.
                  boolean bFound = false;
                  for (String sGallery : app.GalleryList)
                  {
                     if (sGallery.equalsIgnoreCase(c.getString(1)))
                     {
                        bFound = true;
                        break;
                     }
                  }
                  //       
                  // To here we looped the full gallery.
                  if (!bFound)
                  {
                     // 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.
                           app.CallToast(PhotosActivity.this, getString(R.string.ErrorOccured), 0);
                        }
                     }
                     //       
                     ContentResolver cr = getContentResolver();
                     cr.delete(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
                        BaseColumns._ID + "=" + c.getString(3), null);
                     break;                        
                  }
               } 
               while (c.moveToNext());
            }
         }
      }
   }      
}
 69
Author: Paul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-06 16:56:36

Si alguien está buscando un trabajo más simple alrededor de este problema, aquí es cómo resolví el problema.

Tengo un botón de captura y cuando se presiona se envía la intent, lo que agregué es que también voy y obtengo el último id de image mediastore y lo almaceno:

/**
 * Gets the last image id from the media store
 * @return
 */
private int getLastImageId(){
    final String[] imageColumns = { MediaStore.Images.Media._ID };
    final String imageOrderBy = MediaStore.Images.Media._ID+" DESC";
    final String imageWhere = null;
    final String[] imageArguments = null;
    Cursor imageCursor = managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, imageColumns, imageWhere, imageArguments, imageOrderBy);
    if(imageCursor.moveToFirst()){
        int id = imageCursor.getInt(imageCursor.getColumnIndex(MediaStore.Images.Media._ID));
        imageCursor.close();
        return id;
    }else{
        return 0;
    }
}

Luego, cuando la actividad regresa, corro este código para verificar el último id de imagen antes de la captura, luego las consultas para imágenes después de la captura tienen un id más grande que el registrado y si es más, elimina el el registro se encuentra en la ubicación que especificé para que la cámara lo guarde.

/*
 * Checking for duplicate images
 * This is necessary because some camera implementation not only save where you want them to save but also in their default location.
 */
final String[] imageColumns = { MediaStore.Images.Media.DATA, MediaStore.Images.Media.DATE_TAKEN, MediaStore.Images.Media.SIZE, MediaStore.Images.Media._ID };
final String imageOrderBy = MediaStore.Images.Media._ID+" DESC";
final String imageWhere = MediaStore.Images.Media._ID+">?";
final String[] imageArguments = { Integer.toString(MyActivity.this.captureLastId) };
Cursor imageCursor = managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, imageColumns, imageWhere, imageArguments, imageOrderBy);
if(imageCursor.getCount()>1){
    while(imageCursor.moveToNext()){
        int id = imageCursor.getInt(imageCursor.getColumnIndex(MediaStore.Images.Media._ID));
        String path = imageCursor.getString(imageCursor.getColumnIndex(MediaStore.Images.Media.DATA));
        Long takenTimeStamp = imageCursor.getLong(imageCursor.getColumnIndex(MediaStore.Images.Media.DATE_TAKEN));
        Long size = imageCursor.getLong(imageCursor.getColumnIndex(MediaStore.Images.Media.SIZE));
        if(path.contentEquals(MyActivity.this.capturePath)){
            // Remove it
            ContentResolver cr = getContentResolver();
            cr.delete(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, MediaStore.Images.Media._ID + "=?", new String[]{ Long.toString(id) } );
            break;
        }
    }               
}
imageCursor.close();

Para mí esta fue una solución mucho más simple, y he probado en mi HTC que estaba teniendo este problema.

Otra nota al margen, originalmente usé * DATE_TAKEN *not* _ID * como parámetro, pero parece haber un error que en el emulador algunas de las imágenes capturadas a través de la intent tenían su milsecond * DATE_TAKEN * veces multiplicadas por 1000, así que cambié a *_ID * que parece ser mucho más más robusto.

 14
Author: Emil Davtyan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-31 14:25:54

Esto eliminará el archivo de la galería:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == CAMERA_PIC_REQUEST && resultCode == RESULT_OK) { 

        /* Copy the file to other directory or whatever you want */

        // mContext is the context of the activity
        mContext.getContentResolver().delete(data.getData(), null, null);
    }
 }

Acerca del comportamiento EXTRA_OUTPUT no estándar. Creo que este pseudo-algoritmo debería funcionar en todos los casos:

1) No utilice EXTRA_OUTPUT. La imagen / foto siempre irá a la ubicación de la galería.

2) Copie el archivo desde la ubicación de la galería a la ubicación deseada.

3) Elimine (con el código superior) el archivo de la galería.

Pero, por supuesto, parece ser demasiado perfecto... en algunos dispositivos (por ejemplo el Galaxy Tab original con Android 2.3), tienes que usar EXTRA_OUTPUT con ACTION_IMAGE_CAPTURE, sin esto la intent no funciona.

 14
Author: ElYeante,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-31 13:13:12

Bueno, todo el problema creo que viene del hecho de que usted está esperando un cierto resultado de otra aplicación que no está sucediendo. Que es (solo para ser claro) -

  • Inicie una actividad que pueda tomar fotos, ya que su aplicación no captura imágenes.
  • Dile a la otra aplicación dónde quieres guardar el picutre
  • Utilice la imagen guardada en la ubicación especificada.
  • Pero el problema es que la otra aplicación tiene también guardó la imagen en una ubicación diferente también, que no desea que lo haga.

Ahora vamos a verlo desde la otra perspectiva de la aplicación, que está capturando la imagen. Vamos a considerar dos escenarios (Que es posible) -

  • Primero, la aplicación se inicia con la opción del nombre de archivo o ubicación donde se guardará la imagen.
  • En segundo lugar, la aplicación se inicia sin ninguna información adicional como el nombre del archivo o la ubicación donde se va a colocar la imagen guardado.(Esto podría suceder si la aplicación de captura se lanza directamente desde el menú)

Ahora idealmente lo que debería haber sucedido es si hay información adicional como el nombre del archivo o la ubicación, entonces debería haber utilizado esa ubicación si no, entonces puede usar la suya propia. Pero por desgracia, somos de un mundo ideal y ya que nada está escrito en piedra sobre lo que debe suceder cuando se inicia una aplicación de la cámara el desarrollador de la aplicación de la cámara tendrá su propia interpretación.

Desde diferentes dispositivos tenga una aplicación de cámara diferente establecida como predeterminada (sí, la cámara de stock generalmente se reemplaza) los resultados obtenidos son/serán diferentes.

Así que en algunas cámaras se puede guardar en un solo lugar en otro también se puede guardar en la carpeta de la cámara (ya que la aplicación de la cámara siempre puede guardar la imagen capturada en la carpeta de la cámara y guardarla en una ubicación diferente es un bono dado por la aplicación)

Si acaba de pasar un nombre de archivo a la aplicación de la cámara debe ¿la aplicación vuelve después de tomar una sola foto? Creo que no. Entonces, ¿qué debería en tal escenario? Todo es muy ambiguo o una zona gris.

Ahora, si no desea que se guarde en la carpeta de la cámara, averigüe si puede obtener el nombre de archivo de la imagen capturada recientemente y luego elimínelo de su aplicación. O no le diga a la aplicación de la cámara dónde debe guardarse, simplemente obtenga el nombre del archivo y muévalo a la ubicación que desee.

Si usted no consigue el filename entonces usted está a merced del otro desarrollador de aplicaciones. (Hey! no es su culpa tampoco, él sólo lo diseñó de la manera que quiere!)

 5
Author: bluefalcon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-27 10:03:14

Creo que no puedes hacer lo que quieres. Eso es triste, pero no puedo encontrar otra respuesta.

Si trabajas con la implementación de la cámara de Google, funciona bien. Simplemente no almacena foto a galería en EXTRA_OUTPUT se especifica.

Pero cuando te enfrentas a otros dispositivos pueden hacer algo completamente diferente. Eso es porque HTC, LG y tal vez algunos otros tienen la implementación de la cámara personalizada y no se puede hacer nada al respecto. Puedes dejarlo como está o escribir su propia Cámara trabaja exactamente como lo necesitas.

En realidad no está relacionado con esta pregunta, pero un día descubrirás que la intención de recortar no funciona en algunos dispositivos (http://groups.google.com/group/android-developers/browse_frm/thread/2dd647523926192c/4b6d087073a39607?tvc=1&pli=1). Así que de nuevo si lo necesitas tendrás que escribirlo tú mismo.

 2
Author: Fedor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-27 14:54:27

Esta no es una tarea fácil de resolver, pero puede acercarse a un método complicado.Si alguien necesita una solución simple y de trabajo para esto. Prueba el siguiente código:

  1. Guarde la hora actual en milisegundos antes de llamar a la intent de la cámara.
  2. onActivityResult consulta el uri de imagen cuya fecha tomada es mayor que el milisegundo en el paso 1. Y borra el archivo. Eso es.
String[] projection = {MediaStore.Images.ImageColumns.SIZE,
                MediaStore.Images.ImageColumns.DISPLAY_NAME,
                MediaStore.Images.ImageColumns.DATA,
                BaseColumns._ID,MediaStore.Images.ImageColumns.DATE_ADDED};
        final String imageOrderBy = MediaStore.Images.Media._ID + " DESC";
        final String selection = MediaStore.Images.Media.DATE_TAKEN+" > "+mImageTakenTime;
        //// intialize the Uri and the Cursor, and the current expected size.
        Cursor c = null;
        Uri u = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
        c = getActivity().managedQuery(u, projection, selection, null, imageOrderBy);
        if(null != c && c.moveToFirst()){
            ContentResolver cr = getActivity().getContentResolver();
            cr.delete(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                    BaseColumns._ID + "=" + c.getString(3), null);
        }
 2
Author: ms shaiju,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-22 11:58:06

Mira aquí - es un fragmento de código que guarda la imagen en la carpeta EXTRA_OUTPUT sin guardarla en la galería. De esta manera, en mi aplicación solía tomar una imagen directamente de la cámara y luego eliminar la imagen tomada.

 1
Author: barmaley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:02:35

Este es el código que uso que toma una foto y la guarda en la ubicación especificada

Uri outputFileUri;

public void takePhoto() {
    File directory = new File(Environment.getExternalStorageDirectory()
            + "/HI-Tech" + "/");

    if (!directory.exists()) {
        directory.mkdir();
    }

    int count = 0;
    if (directory != null) {
        File[] files = directory.listFiles();
        if (files != null) {
            count = files.length;
        }
    }
    count++;
    String imagePath = "IMAGE_" + count + ".jpg";
    File file = new File(directory, imagePath);
    outputFileUri = Uri.fromFile(file);

        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
    startActivityForResult(intent, JobActivity.TAKE_PIC);
}

Luego manejo la respuesta.

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    try {
        if (resultCode == RESULT_OK) {
            if (requestCode == JobActivity.TAKE_PIC) {
                Bitmap bitmap = decodeFile(new File(outputFileUri.getPath()), 160, 120);
    } catch (Exception e) {
        Log.e("Error", "Unable to set thumbnail", e);
    }
}

Tuve que declarar el outputFileUri como una variable global ya que no encontré forma de adquirir la ruta guardada onActivityResult. Al pasar el outputFileUri notará que la imagen no se guarda en la carpeta de la cámara, sino en la ubicación especificada. He probado este código en mi Nexus1 y una cosa samsung barato.

Espero que esto ayude

 1
Author: Bear,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-23 23:44:28

Yo también estaba luchando con este tema. Por cierto, este problema está marcado como Obsolete en el rastreador de errores de Android . Por alguna razón, el equipo de Android ya no considera esto como un error. Tal vez porque esto está relacionado con el fabricante.

Parece que todas las soluciones (de este hilo y otras entradas de blog, etc.) formar el siguiente algoritmo:

  1. Guardar un identificador único de la última foto tomada;
  2. Inicie la actividad de la cámara usando Intent con EXTRA_OUTPUT ;
  3. Tome una foto y verifique si el id de la última foto tomada en la Galería ha cambiado para decidir si debe eliminarse.

Algo similar se propone en la respuesta aceptada.

Pero descubrí que tal enfoque no se puede usar en un código de producción. Por ejemplo, imaginemos una situación simple:

Almacena algún id de la última foto tomada en la galería y ejecuta la actividad de la cámara. Cuando el usuario toma una foto en algunos dispositivos, la actividad de la cámara muestra un diálogo con los botones Cancel y OK (o algo así). Y la lógica detrás de ellos es la siguiente:

  • si el usuario presiona Cancel vuelve a la actividad de la cámara y puede continuar tomando fotos.
  • si él/ella (el usuario) presiona el botón OK, la actividad de la cámara devuelve el resultado a su aplicación.

Las notas importantes aquí: resulta que en algunos dispositivos (he probado en LG y HTC) la imagen ya se puede guardar mientras que este diálogo es presentar.

Ahora imagine lo que si el usuario por alguna razón decide tocar el botón Home e inicia otra aplicación (por ejemplo, otra aplicación de cámara donde el usuario puede tomar diferentes fotos!). Y luego regresa a su aplicación donde todavía se presenta ese cuadro de diálogo y presiona OK. Obviamente, en ese caso, su aplicación eliminará el archivo equivocado... y decepcionar al usuario :(

Así que después de mucho investigar decidí que el mejor enfoque para superar este problema es escribir su propia cámara motor o simplemente use algunas librerías de terceros como esta: material camera .

 1
Author: Stan Mots,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-08 19:24:02

Su mejor apuesta es probablemente manejar la clase Camera directamente, y luego almacenar el jpeg o raw devuelto en la devolución de llamada donde desee.

Alternativamente, puede intentar eliminar la imagen tomada por _id del proveedor de contenido para medios después de que se haya agregado. Simplemente encuéntralo por consulta y elimínalo a través del ContentResolver.eliminar, aunque no estoy seguro sobre la implementación.

 0
Author: HaMMeReD,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-27 21:54:01

Después de luchar con esto durante algún tiempo, mordí la bala y escribí mi propia actividad caputere de cámara. Estoy convencido de que esto es mucho más portátil y más seguro que las soluciones MediaStore.ACTION_IMAGE_CAPTURE. La imagen se almacenará donde la almacena y en ningún otro lugar y no está en peligro de eliminar algún archivo no relacionado por accidente. Además, es posible adaptar la función real de la cámara exactamente a los requisitos.

Por razones de portabilidad, usé la clase Camera, no camera2.

Vale la pena tener en cuenta que todos los parámetros de la cámara deben ser establecidos, especialmente el tamaño de la imagen, el modo de enfoque y el modo de flash, todos ellos pueden estar en un estado inesperado al iniciar la cámara.

Publicando esto como una respuesta, no como un comentario, porque en mi opinión es la respuesta correcta que resulta en un esfuerzo mínimo.

 0
Author: Moritz Both,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-15 11:42:51
protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
    if (requestCode == CAMERA_REQUEST && resultCode == RESULT_OK) {

    Bitmap photo = (Bitmap) data.getExtras().get("data");
    Uri tempUri = Utils.getUri(getActivity(), photo);
    File finalFile = new File(getRealPathFromURI(tempUri));
    finalFile.delete();
    }  
}


public String getRealPathFromURI (Uri contentUri) {
    String path = null;
    String[] proj = { MediaStore.MediaColumns.DATA };
    Cursor cursor = getActivity().getContentResolver().query(contentUri, proj, null, null, null);
    if (cursor.moveToFirst()) {
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA);
        path = cursor.getString(column_index);
    }
    cursor.close();
    return path;
}
 0
Author: Vignes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-16 12:23:44