Una sola intención de permitir que el usuario tome una foto O escoge una imagen de la galería en Android
Estoy desarrollando una aplicación para Android 2.1 hacia arriba. Quiero habilitar a mis usuarios para seleccionar una imagen de perfil dentro de mi aplicación (no estoy usando el marco de contactos).
La solución ideal sería disparar una intención que permite al usuario seleccionar una imagen de la galería, pero si una imagen apropiada no está disponible a continuación, utilizar la cámara para tomar una foto (o viceversa, es decir, permitir al usuario tomar una foto, pero si Ellos ya saben que ya tienen una imagen adecuada, déjalos caer en la galería y escoger esa imagen).
- ¿Cómo preparar una imagen para una pantalla de densidad más pequeña?
- ¿Alguien ha hecho una "animación de escaneo" básica en una imagen?
- Android: Scrollable (horizontal y vertical) ImageView con los botones sobrepuestos
- Android: ¿cómo hacer una imagen de mapa clicable con cada país produciendo una acción diferente?
- Botones de forma personalizada en Android - ¿Lo estoy haciendo bien?
Actualmente puedo hacer uno o el otro pero no ambos.
Si me dirijo directamente al modo de cámara usando MediaStore.ACTION_IMAGE_CAPTURE, entonces no hay opción para ir a la galería.
Si voy directamente a la galería usando Intent.ACTION_PICK entonces puedo escoger una imagen pero si hago clic en el botón de la cámara (en la esquina superior derecha de la galería), se dispara una nueva intención de la cámara. Por lo tanto, cualquier imagen que se toma no se devuelve directamente a mi aplicación. (Seguro que puede presionar el botón de volver a caer de nuevo en la galería y seleccionar la imagen de allí, pero esto es un paso innecesario adicional y no es en absoluto intuitivo).
Así que hay una manera de combinar ambos o voy a tener que ofrecer un menú para hacer uno u otro desde mi aplicación? Parece que sería un caso de uso común … seguramente me estoy perdiendo algo?
- Binarizar imagen en Android
- Cómo implementar efectos de distorsión de imagen en Android
- Android: Error al usar el mapa de bits para mostrar la imagen usando el estudio de Android
- Tamaño de la imagen de fondo Android en píxeles
- Cargador universal de imágenes de Android que muestra parcialmente las imágenes
- ¿Cómo se repite una imagen sólo verticalmente en android?
- Cargando imágenes con Picasso desde el almacenamiento interno
- ¿Es posible hacer transparente el fondo de un botón?
UPDATE : La otra respuesta, utilizando EXTRA_INITIAL_INTENTS
, es mejor en este momento. En el momento en que escribí mi respuesta, EXTRA_INITIAL_INTENTS
todavía no existía, ya que se añadió en el API Nivel 5.
Así que hay una manera de combinar ambos o voy a tener que ofrecer un menú para hacer uno u otro desde mi aplicación?
Escriba su propia galería que tiene las características que usted desea.
Yo creo que un menú sería más sencillo.
Parece que sería un caso de uso común … seguramente me estoy perdiendo algo?
El desarrollador al lado de usted pensará que la galería debe permitirle escoger de la galería local o bien saltar a Flickr para hacer una selección desde allí. Otro desarrollador pensará que la cámara no sólo debe permitir "tomar una fotografía" a través de la cámara, sino "tomar una fotografía" a través de elegir algo de la galería, invirtiendo las cosas de la forma en que lo imaginan. Sin embargo, otro desarrollador pensará que la galería debe permitir la recolección de la galería local, o Flickr, o la cámara, o una cámara web conectada a la red. Todavía otro desarrollador pensará que la galería es estúpida y los usuarios sólo deben recoger archivos a través de un explorador de archivos. Y así.
Todo esto en un entorno (teléfonos móviles) donde flash para el sistema operativo es una prima.
Por lo tanto, en mi opinión, no es del todo sorprendente que el núcleo del equipo de Android elegido para proporcionar bloques de construcción para que usted pueda montar como mejor le parezca, en lugar de tratar de adaptarse a cada patrón posible.
Puedes intentar hacer algo como esto:
// ... // Within your enclosing Class // ... private static final int SELECT_PICTURE = 1; // ... Intent pickIntent = new Intent(); pickIntent.setType("image/*"); pickIntent.setAction(Intent.ACTION_GET_CONTENT); Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); String pickTitle = "Select or take a new Picture"; // Or get from strings.xml Intent chooserIntent = Intent.createChooser(pickIntent, pickTitle); chooserIntent.putExtra ( Intent.EXTRA_INITIAL_INTENTS, new Intent[] { takePhotoIntent } ); startActivityForResult(chooserIntent, SELECT_PICTURE);
Para ver cómo manejar el resultado de la actividad, por favor refiérase a esta pregunta
Nota: un punto crítico es cómo determinar si se usó la cámara o la galería. Esto se muestra en este ejemplo de código: https://stackoverflow.com/a/12347567/294884
Puede proceder de esta manera en su Actividad:
private static final int REQUEST_CODE_PICTURE= 1; /** * Click on View to change photo. Sets into View of your layout, android:onClick="clickOnPhoto" * @param view View */ public void clickOnPhoto(View view) { Intent pickIntent = new Intent(); pickIntent.setType("image/*"); pickIntent.setAction(Intent.ACTION_GET_CONTENT); Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); String pickTitle = "Take or select a photo"; Intent chooserIntent = Intent.createChooser(pickIntent, pickTitle); chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] { takePhotoIntent }); startActivityForResult(chooserIntent, REQUEST_CODE_PICTURE); }
A continuación, agregue siempre en su Actividad el método onActivityResult:
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE_PICTURE && resultCode == Activity.RESULT_OK) { if (data == null) { return; } try { InputStream inputStream = getContentResolver().openInputStream(data.getData()); Bitmap bitmap = BitmapFactory.decodeStream(inputStream); imgPhoto.setImageBitmap(bitmap); } catch (FileNotFoundException e) { e.printStackTrace(); } } }
- ¿Cómo cambiar el color en la barra de progreso circular?
- Variables de miembro vs setArguments en Fragments