2010-11-15 21 views
23

Hola estoy usando ACTION_IMAGE_CAPTURE para la captura de imagen utilizando Intent de la siguiente manera:obtener la ruta de la imagen de ACTION_IMAGE_CAPTURE Intención

Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
cameraIntent.putExtra(
MediaStore.EXTRA_OUTPUT, (new File(Environment.getExternalStorageDirectory(), 
String.valueOf(System.currentTimeMillis()) + ".jpg")) 
); 
startActivityForResult(cameraIntent, 0); 

necesito para guardar la imagen en una tarjeta sd y recuperar el camino de esa imagen utilizando el método onActivityResult. No sé cómo obtener la ruta de la imagen capturada actualmente.

Si alguien sabe por favor ayuda.

Gracias

+2

por favor, poner todo el código dentro de los cuadros de texto "código", que hace que la lectura de su código mucho más fácil, por lo que podemos ser capaces de responder a sus preguntas – Samuel

Respuesta

49

Esta es la forma en que funciona en 2.2 (diferente que en versiones anteriores). Cuando se inicia el intento

 String fileName = "temp.jpg"; 
     ContentValues values = new ContentValues(); 
     values.put(MediaStore.Images.Media.TITLE, fileName); 
     mCapturedImageURI = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); 

     Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     intent.putExtra(MediaStore.EXTRA_OUTPUT, mCapturedImageURI); 
     startActivityForResult(intent, CAPTURE_PICTURE_INTENT); 

es necesario recordar mCapturedImageURI.

Cuando se captura la imagen, en la que onActivityResult() uso URI para obtener la ruta del archivo:

  String[] projection = { MediaStore.Images.Media.DATA}; 
      Cursor cursor = managedQuery(mCapturedImageURI, projection, null, null, null); 
      int column_index_data = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
      cursor.moveToFirst(); 
      String capturedImageFilePath = cursor.getString(column_index_data); 

ACTUALIZACIÓN: en los nuevos dispositivos Android que no tendría que MediaStore.EXTRA_OUTPUT, sino que más bien deducir imagen/vídeo URI de data.getData() recibido de onActivityResult (..., datos de intención), como muy bien se describe en

Android ACTION_IMAGE_CAPTURE Intent

Sin embargo, puesto que esta parte está sujeto a la adaptación del fabricante, es posible que aún encuentre teléfonos donde el enfoque "antiguo" puede ser útil.

+1

gracias por este, pero no funciona en Samsung Galaxy I o II.Devuelve una miniatura en HTC Incredible :-( –

+0

Después de tomar la foto, la actividad se vuelve a cargar y al iniciar mi aplicación, muestra "Esperando la depuración ....". Es algo que omití. Compruebe el código aquí: http: // stackoverflow. com/questions/10510547/android-display-captured-image-in-img-tag – Ponmalar

+0

Desde onActivityResult() puede obtener el nombre real en la tarjeta SD. capturedImageFilePath lo tiene. – Zelimir

7

Otra forma, probado en android 2.1, es tomar la ID o AbsolutePath de la galería de la última imagen.

Se puede hacer así:

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

Y para eliminar el archivo:

private void removeImage(int id) { 
     ContentResolver cr = getContentResolver(); 
     cr.delete(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, MediaStore.Images.Media._ID + "=?", new String[]{ Long.toString(id) }); 
} 

Este código se basa en el mensaje: Deleting a gallery image after camera intent photo taken

+0

gracias por su respuesta de ayuda! – michoprogrammer

2

Esta pregunta es muy antiguo, pero He estado luchando con el mismo problema durante medio día. La cuestión es que su ACTION_IMAGE_CAPTURE intención siempre devolverá code=-1 y data=null a menos que establezca los siguientes permisos para la aplicación en su AndroidManifest.xml archivo:

<uses-permission android:name="android.permission.CAMERA"/> 

También puede establecer lo siguiente si desea grabar el audio de su aplicación:

<uses-permission android:name="android.permission.RECORD_AUDIO"/> 
+1

Después de establecer el permiso también da código = -1 y data = null en nexus 4 –

1

Retire

intent.putExtra(MediaStore.EXTRA_OUTPUT, mCapturedImageURI); 

y añadir

Uri uri = data.getData();in onActivityResult 
Cuestiones relacionadas