Imagen procedente de cámara o galería?
Tengo un selector de intenciones que me permite seleccionar la imagen de la galería o cámara de esta manera:
Intent galleryIntent = new Intent(Intent.ACTION_GET_CONTENT,null); galleryIntent.setType("image/*"); galleryIntent.addCategory(Intent.CATEGORY_OPENABLE); Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); Intent chooser = new Intent(Intent.ACTION_CHOOSER); chooser.putExtra(Intent.EXTRA_INTENT, galleryIntent); chooser.putExtra(Intent.EXTRA_TITLE, "title"); Intent[] intentArray = {cameraIntent}; chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentArray); startActivityForResult(chooser,REQUEST_CODE);
Quiero que mi método onActivityResult
sea así:
- Android: Actualizar la Galería después de guardar nuevas imágenes
- Desplazamiento de una Galería con botones
- Intención para obtener múltiples imágenes
- ¿Cómo puedo recuperar la ruta de una imagen en la galería de Android?
- Desplazamiento bidireccional para Android
protected void onActivityResult(int requestCode, int resultCode, Intent data) { if(Condition == picture_coming_from_gallery) { //my code here } else if(condition == picture_coming_from_camera) { //another code here } }
¿Cuál es la condición que me permite saber de qué fuente proviene mi imagen?
Actualizado:
Ahora funciona y aquí está la solución:
protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_CODE && resultCode == Activity.RESULT_OK) { if(data.getData()!=null) { try { if (bitmap != null) { bitmap.recycle(); } InputStream stream = getContentResolver().openInputStream(data.getData()); bitmap = BitmapFactory.decodeStream(stream); stream.close(); imageView.setImageBitmap(bitmap); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } else { bitmap=(Bitmap) data.getExtras().get("data"); imageView.setImageBitmap(bitmap); } super.onActivityResult(requestCode, resultCode, data); } }
¡Gracias por tu ayuda!
- La galería onItemClick y onTouchEvent no funcionan juntas desde la versión android 3.0
- Galería de imágenes de url en android?
- Cómo abrir la galería a través de la intención sin resultado
- Selección de varias fotos de la galería de imágenes de un dispositivo mediante PhoneGap
- Cambiar estilo de borde en Galería
- Cómo hacer la galería de imágenes en 3D para dispositivos Android 3D como HTC Evo 3D u otros dispositivos compatibles con 3D?
- Infinite Scrolling Galería Ver con descripción de texto
- Android Gallery Ver Problema de desplazamiento cuando onClickListener para los elementos dados
Aunque la pieza actual de código es una manera ordenada de presentar opciones para elegir, me encontré con que era muy difícil de manejar. Al menos en mi caso de uso fue. Necesito almacenar imágenes tomadas de la cámara para procesar más en el SDK de Aviary ( si el usuario así lo elige ).
Para ello, me gustaría proponer una solución.
Esto no aborda su pregunta per se. Pero ofrece una alternativa teniendo en cuenta que necesita saber de dónde viene la imagen (cámara / galería) .
AlertDialog.Builder builder = new AlertDialog.Builder(StatusUpdate.this); builder.setTitle("Choose Image Source"); builder.setItems(new CharSequence[] {"Gallery", "Camera"}, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { switch (which) { case 0: // GET IMAGE FROM THE GALLERY Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("image/*"); Intent chooser = Intent.createChooser(intent, "Choose a Picture"); startActivityForResult(chooser, ACTION_REQUEST_GALLERY); break; case 1: Intent getCameraImage = new Intent("android.media.action.IMAGE_CAPTURE"); File cameraFolder; if (android.os.Environment.getExternalStorageState().equals (android.os.Environment.MEDIA_MOUNTED)) cameraFolder = new File(android.os.Environment.getExternalStorageDirectory(), "some_directory_to_save_images/"); else cameraFolder= StatusUpdate.this.getCacheDir(); if(!cameraFolder.exists()) cameraFolder.mkdirs(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd'T'HHmmss"); String timeStamp = dateFormat.format(new Date()); String imageFileName = "picture_" + timeStamp + ".jpg"; File photo = new File(Environment.getExternalStorageDirectory(), "some_directory_to_save_images/" + imageFileName); getCameraImage.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photo)); initialURI = Uri.fromFile(photo); startActivityForResult(getCameraImage, ACTION_REQUEST_CAMERA); break; default: break; } } }); builder.show();
Este es el resultado ( sigo manteniendo que el código da un conjunto de selección mucho mejor, pero de nuevo, no es la cosa más simple en su caso de uso o en el mío tampoco ):
Ahora puede procesar el resultado en función del origen de la selección:
protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK) { switch (requestCode) { case ACTION_REQUEST_GALLERY: break; case ACTION_REQUEST_CAMERA: break; } } };
ACTUALIZADO:
¡¡Lo encontré!! Hay una respuesta aquí en SO que direcciones exactamente lo que necesita. Todavía es una * solución de tipos *. En el sentido de que no se basa en diferentes requestCodes
. Pero funciona sin embargo.
Extraño lo extrañé cuando estaba atascado con esto. Unesdoc.unesco.org
NOTA: No estoy publicando el código aquí y estoy enlazando a él en su lugar. Todos los accesorios van al autor original. Todos los derechos reservados
Puede distinguir utilizando REQUEST_CODE
private static final int PICK_FROM_CAMERA = 1; private static final int PICK_FROM_GALLARY = 2; /* For Image capture from camera */ Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, PICK_FROM_CAMERA); /* For Image capture from Gallary*/ startActivityForResult(new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI), PICK_FROM_GALLARY); } public void onActivityResult(int requestCode, int resultCode, Intent intent) { super.onActivityResult(requestCode, resultCode, intent); switch (requestCode) { case PICK_FROM_CAMERA: if (resultCode == Activity.RESULT_OK) { Bitmap bitmapImage = (Bitmap) intent.getExtras().get("data"); } break; case PICK_FROM_GALLARY: if (resultCode == Activity.RESULT_OK) { Uri mImageCaptureUri = intent.getData(); } break; } }
- Best practice android: onClick atributo XML o setOnClickListener?
- Android Cómo agregar un archivo xml personalizado en res / values y cómo registrar customvalues.xml con el sistema