ver toma todas solo sincronizacion seguridad quiero mis guardadas google fotos esperando copia celular app android image camera android-intent gallery

android - toma - mis fotos guardadas



Solo intento de permitir que el usuario tome una foto O elija una imagen de la galerĂ­a en Android (4)

Estoy desarrollando una aplicación para Android 2.1 en adelante. Quiero permitir a mis usuarios seleccionar una imagen de perfil dentro de mi aplicación (no estoy usando el marco de contactos).

La solución ideal sería disparar un intento que permita al usuario seleccionar una imagen de la galería, pero si una imagen adecuada no está disponible, utilice la cámara para tomar una foto (o viceversa, es decir, permita al usuario tomar una fotografía, pero si ellos saben que ya tienen una imagen adecuada, déjalos caer en la galería y elegir dicha imagen).

Actualmente puedo hacer uno u otro pero no ambos.

Si voy directamente al modo de cámara usando MediaStore.ACTION_IMAGE_CAPTURE, entonces no hay ninguna opción para entrar en la galería.

Si voy directamente a la galería usando Intent.ACTION_PICK, puedo elegir una imagen, pero si hago clic en el botón de la cámara (en la esquina superior derecha de la galería), se activa una nueva cámara. Por lo tanto, cualquier imagen que se tome no se devuelve directamente a mi aplicación. (Claro que puedes presionar el botón Atrás para regresar a la galería y seleccionar la imagen a partir de ahí, pero este es un paso adicional innecesario y no es para nada intuitivo).

Entonces, ¿hay alguna 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 falta algo?


Mi respuesta es casi idéntica a la solución @Macarse pero también agrego un intento adicional para mostrar aplicaciones de la galería (por ejemplo, Google Fotos) y está escrita en Kotlin:

val REQUEST_CODE_GET_IMAGE = 101 private fun addProfileImage() { val pickImageFileIntent = Intent() pickImageFileIntent.type = "image/*" pickImageFileIntent.action = Intent.ACTION_GET_CONTENT val pickGalleryImageIntent = Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI) val captureCameraImageIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) val pickTitle = "Capture from camera or Select from gallery the Profile photo" val chooserIntent = Intent.createChooser(pickImageFileIntent, pickTitle) chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, arrayOf(captureCameraImageIntent, pickGalleryImageIntent)) startActivityForResult(chooserIntent, REQUEST_CODE_GET_IMAGE) }

Ejemplo de bonificación:

private var imageTempFile: File? = null private var imageMimeType: String? = null private fun extractImage(intent: Intent?) { val imageUri = intent?.data imageUri?.let { Glide.with(this) .load(imageUri) .into(profileImageCiv) imageTempFile = MediaUtils.copyContentFromUriToCacheFile(this, imageUri, Settings.DIRECTORY_CACHE_TEMP_PROFILE_IMAGE) imageMimeType = MediaUtils.getMimeType(this, imageUri) } ?: run { intent?.extras?.get("data")?.let { bitmap -> // Bitmap was returned as raw bitmap Glide.with(this) .load(bitmap) .into(profileImageCiv) imageTempFile = MediaUtils.writeBitmapToCacheFile(this, bitmap as Bitmap, Settings.DIRECTORY_CACHE_TEMP_PROFILE_IMAGE) imageMimeType = "image/jpeg" // The bitmap was compressed as JPEG format. The bitmap itself doesn''t have any format associated to it } ?: run { imageTempFile = null imageMimeType = null Log.e("Intent data is null.") Log.d("Error during photo selection") } } }


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); }

Luego, 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(); } } }


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, consulte esta pregunta

Nota: un punto crítico es cómo determinar si se utilizó la cámara o la galería. Esto se muestra en este ejemplo de código: https://.com/a/12347567/294884


ACTUALIZAR : La otra respuesta, usando EXTRA_INITIAL_INTENTS , es una mejor en este punto. En el momento en que escribí mi respuesta, EXTRA_INITIAL_INTENTS aún no existía, ya que se agregó en API Nivel 5.

Entonces, ¿hay alguna manera de combinar ambos o voy a tener que ofrecer un menú para hacer uno u otro desde mi aplicación?

Escribe tu propia galería que tenga las características que deseas.

Creo que un menú sería más simple.

Parece que sería un caso de uso común ... seguramente me falta algo?

El desarrollador junto a ti pensará que la galería debería permitirte elegir de la galería local o saltar a Flickr para hacer una selección desde allí. Otro desarrollador pensará que la cámara no solo debe permitir "tomar una foto" a través de la cámara, sino también "tomar una foto" al elegir algo de la galería, invirtiendo las cosas de la forma en que lo imagina. Sin embargo, otro desarrollador pensará que la galería debería permitir la selecció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 solo deben elegir archivos a través de un explorador de archivos. Y así.

Todo esto en un entorno (teléfonos móviles) donde el flash para el sistema operativo es un bien escaso.

Por lo tanto, en mi humilde opinión, no es del todo sorprendente que el equipo central de Android eligió proporcionar elementos básicos para que usted ensamble como mejor le parezca, en lugar de tratar de adaptarse a todos los patrones posibles.