studio picture nougat intent getdata from example data action_image_capture android image android-intent capture

picture - captura de imágenes con MediaStore.ACTION_IMAGE_CAPTURE intento en Android



take photo android nougat (2)

Mi método onActivityResult () se ve así y funciona al obtener la imagen de MediaStore.ACTION_IMAGE_CAPTURE :

public void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK) { Bundle extras = data.getExtras(); Bitmap mImageBitmap = (Bitmap) extras.get("data"); } }

Estoy capturando imágenes usando MediaStore.ACTION_IMAGE_CAPTURE intento. funciona bien en la mayoría de los dispositivos. pero no está funcionando correctamente en algún último dispositivo Android como se esperaba.

mi intención es capturar la imagen usando la cámara y enviarla al servidor, pero no para almacenar esa imagen en la galería predeterminada del dispositivo.

* * : Cuando capturo la imagen, devuelve otra imagen de la galería en el método de prueba de actividad en lugar de la imagen capturada en algunos de los últimos dispositivos con Android. Estoy usando el código a continuación para capturar y almacenar imágenes.

public void launchCamera(View v) { Intent camera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(camera, CAMERA_PIC_REQUEST ); }

En el método onActivityResult,

String[] projection = { MediaStore.Images.ImageColumns.SIZE, MediaStore.Images.ImageColumns.DISPLAY_NAME, MediaStore.Images.ImageColumns.DATA, BaseColumns._ID, }; Cursor c = null; Uri u = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; try { if (u != null) { c = managedQuery(u, projection, null, null, null); } if ((c != null) && (c.moveToLast())) { Bitmap thumbnail = getBitMapFromLocalPath(c.getString(2), 3); idsImagesgot.add(thumbnail); ContentResolver cr = getContentResolver(); cr.delete( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, BaseColumns._ID + "=" + c.getString(3), null); } } finally { if (c != null) { c.close(); } }

¿Alguien puede ayudarme en este sentido?

Gracias por adelantado.

Sathish


Las fotos tomadas con ACTION_IMAGE_CAPTURE no están registradas en MediaStore automáticamente en todos los dispositivos.

La guía oficial de Android da ese ejemplo: http://developer.android.com/guide/topics/media/camera.html#intent-receive Pero eso tampoco funciona en todos los dispositivos.

El único método confiable que conozco consiste en guardar la ruta a la imagen en una variable local. Tenga cuidado de que su aplicación se mate mientras está en segundo plano (mientras la aplicación de la cámara se está ejecutando), por lo que debe guardar la ruta durante onSaveInstanceState.

Editar después de comentar:

Cree un nombre de archivo temporal donde se almacenará la foto al iniciar el intento.

File tempFile = File.createTempFile("my_app", ".jpg"); fileName = tempFile.getAbsolutePath(); Uri uri = Uri.fromFile(tempFile); Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); startActivityForResult(intent, PICTURE_REQUEST_CODE);

fileName es una Cadena, un campo de tu actividad. Debes guardarlo de esa manera:

@Override public void onSaveInstanceState(Bundle bundle) { super.onSaveInstanceState(bundle); bundle.putString("fileName", fileName); }

y recuperarlo en onCreate ():

public void onCreate(Bundle savedInstanceState) { if (savedInstanceState != null) fileName = savedInstanceState.getString("fileName"); // ... }

Ahora, en el momento de onActivityResult, usted sabe el nombre del archivo donde se almacenó la foto ( fileName ). Puede hacer lo que desee con él y luego eliminarlo.

19/09/2013 editar: Parece que algunas aplicaciones de cámara ignoran putExtra uri y almacenan la foto en un lugar diferente. Entonces, antes de usar el valor de fileName debe verificar si la intención es nula o no. Si obtiene un intento no nulo, entonces debería preferir intent.getData() sobre fileName . Use fileName como solución de respaldo solo cuando sea necesario.