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).

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?

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(); } } } 
  • BitmapFactory No se puede decodificar el flujo
  • Android, cómo establecer imageview con el porcentaje en relativelayout
  • Cómo almacenar la imagen como blob en Sqlite y cómo recuperarlo?
  • Cómo configurar la imagen en la vista de la imagen en android?
  • Android ImageView cómo adaptarse a la parte inferior izquierda, como setScaleType (ScaleType.FIT_END) ;, pero no se ajusta a la parte inferior derecha
  • Proporcionalmente el tamaño de una vista de imagen en Android
  • Android: Imagen mostrada en Webview desde Url con pérdida de alta calidad
  • Android codificar imagen con límite de tamaño máximo
  • Android: configuración del relleno en un fondo de imagen de superposición
  • Mostrar fotos se queda sin memoria
  • Imagen de umbral Blanco-Blanco en tiempo real de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.