Quiero escribir un módulo donde con un clic de un botón se abre la cámara y puedo hacer clic y capturar una imagen. Si no me gusta la imagen, puedo eliminarla y hacer clic en una imagen más y luego seleccionar la imagen y debería volver y mostrar esa imagen en la actividad.
278
Respuestas:
Aquí hay un ejemplo de actividad que iniciará la aplicación de la cámara y luego recuperará la imagen y la mostrará.
Tenga en cuenta que la aplicación de la cámara le brinda la posibilidad de revisar / retomar la imagen, y una vez que se acepta una imagen, la actividad la muestra.
Aquí está el diseño que utiliza la actividad anterior. Es simplemente un LinearLayout que contiene un botón con id button1 y un ImageView con id imageview1:
Y un último detalle, asegúrese de agregar:
y si la cámara es opcional para la funcionalidad de su aplicación. asegúrese de establecer require a false en el permiso. Me gusta esto
a su manifiesto.xml.
fuente
<uses-feature/>
con elandroid:required="false"
atributo:<uses-feature android:name="android.hardware.camera" android:required="false"></uses-feature>
Bitmap photo = (Bitmap) data.getExtras().get("data");
no toma la imagen que se tomó. Toma una miniatura de la imagen que se tomó.Actualización (2020)
Google ha añadido una nueva
ActivityResultRegistry
API que "le permite manejar elstartActivityForResult()
+onActivityResult()
, así comorequestPermissions()
+onRequestPermissionsResult()
fluye sin anulando métodos en su actividad o fragmento, brinda una mayor seguridad de tipos a través deActivityResultContract
, y proporciona ganchos para probar estos flujos" - fuente .La API se agregó en androidx.activity 1.2.0-alpha02 y androidx.fragment 1.3.0-alpha02 .
Entonces ahora puede hacer algo como:
Eche un vistazo a la documentación para aprender a usar la nueva API de resultados de actividad: https://developer.android.com/training/basics/intents/result#kotlin
Hay muchos ActivityResultContracts incorporados que le permiten hacer diferentes cosas como elegir contactos, solicitar permisos, tomar fotos o grabar videos. Probablemente esté interesado en ActivityResultContracts.TakePicture que se muestra arriba.
Tenga en cuenta que androidx.fragment 1.3.0-alpha04 desprecia las API
startActivityForResult()
+onActivityResult()
yrequestPermissions()
+onRequestPermissionsResult()
en Fragment. Por lo tanto, parece que esaActivityResultContracts
es la nueva forma de hacer las cosas de ahora en adelante.Respuesta original (2015)
Me llevó algunas horas hacer que esto funcionara. El código es casi una copia y pega de developer.android.com , con una pequeña diferencia.
Solicite este permiso en
AndroidManifest.xml
:En su
Activity
, comience definiendo esto:Luego dispara esto
Intent
en unonClick
:Agregue el siguiente método de soporte:
Luego recibe el resultado:
Lo que lo hizo funcionar es
MediaStore.Images.Media.getBitmap(this.getContentResolver(), Uri.parse(mCurrentPhotoPath))
, que es diferente del código de developer.android.com . El código original me dio unFileNotFoundException
.fuente
android.os.FileUriExposedException: file:///storage/emulated/0/Pictures/JPEG_20180823_102340_722874009725833047.jpg exposed beyond app through ClipData.Item.getUri()
. Alguna idea de como arreglar esto? @AlbertVilaCalvostorageDir = Context.getFilesDir();
en lugar de archivostorageDir = Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES);
. De lo contrario, recibí un error de permiso denegado.Capturar foto + Elegir de la galería:
fuente
ResultCode == 1
dentroResultCode == RESULT_OK
?requestCode==1
, ayuda a identificar quién inició la solicitud.Sé que es un hilo bastante antiguo, pero todas estas soluciones no están completas y no funcionan en algunos dispositivos cuando el usuario gira la cámara porque los datos en onActivityResult son nulos. Así que aquí hay una solución que he probado en muchos dispositivos y hasta ahora no he tenido ningún problema.
Primero declara tu variable Uri en tu actividad:
Luego cree su carpeta temporal para almacenar la imagen capturada e intente capturar la imagen con la cámara:
Y ahora aquí viene una de las cosas más importantes, debe guardar su uriFilePath en onSaveInstanceState, porque si no lo hizo y el usuario giró su dispositivo mientras usaba la cámara, su uri sería nula.
Después de eso, siempre debe recuperar su uri en su método onCreate:
Y aquí viene la última parte para obtener su Uri en onActivityResult:
PD: No olvide agregar permisos para la cámara y ext. almacenamiento escribiendo a su Manifiesto.
fuente
Aquí puede abrir la cámara o galería y configurar la imagen seleccionada en vista de imagen
Agregar permisos en manifiesto
En onCreate ()
Cuadro de diálogo Mostrar opciones (para seleccionar una imagen de la cámara o galería)
Obtener foto de la galería
Obtener foto de la cámara
Una vez que la imagen se selecciona o captura, entonces,
Ahora es el momento de guardar la imagen.
Pedir permiso
fuente
Necesita leer sobre la cámara . (Creo que para hacer lo que quiera, tendría que guardar la imagen actual en su aplicación, seleccionar / eliminar allí y luego recuperar la cámara para volver a intentarlo, en lugar de volver a intentarlo directamente dentro de la cámara).
fuente
Aquí está el código que he usado para capturar y guardar la imagen de la cámara y luego mostrarlo en la vista de imagen. Puede usar de acuerdo a su necesidad.
Debe guardar la imagen de la cámara en una ubicación específica, luego buscarla desde esa ubicación y luego convertirla en una matriz de bytes.
Aquí hay un método para abrir la captura de la actividad de la imagen de la cámara.
entonces su método onActivityResult () debería ser así.
Aquí está el método getBitmap () utilizado en onActivityResult (). He realizado todas las mejoras de rendimiento que pueden ser posibles al obtener el mapa de bits de la imagen de captura de la cámara.
¡Espero eso ayude!
fuente
Capture la foto de la cámara + elija la imagen de la galería y configúrela en el fondo del diseño o vista de imagen Aquí hay un código de muestra.
fuente
En actividad:
en layout.xml:
en manifest.xml:
fuente
Puede usar una cámara personalizada con una imagen en miniatura. Puedes mirar mi proyecto .
fuente
Creé un cuadro de diálogo con la opción de elegir Imagen de la galería o cámara. con una devolución de llamada como
Al principio debemos definir el permiso en AndroidManifest ya que necesitamos escribir una tienda externa mientras creamos un archivo y leemos imágenes de la galería
Cree un file_paths xml en app / src / main / res / xml / file_paths.xml
con camino
Luego, debemos definir el archivo provier para generar contenido uri para acceder al archivo almacenado en almacenamiento externo
Diseño Dailog
ImagePicker Dailog
}
Llamar a Actividad o fragmento como este Definir ImagePicker en Fragmento / Actividad
Luego llame a dailog al hacer clic en el botón
fuente
Aquí está el código completo:
Recuerde agregar permisos para la cámara también.
fuente
Puede usar este código para escuchar el onClick (puede usar ImageView o el botón)
Para mostrar en su imagen
Nota: inserte esto en el manifiesto
fuente
Use el siguiente código para capturar imágenes con su cámara móvil. Si está utilizando Android con una versión superior a Lolipop, también debe agregar la solicitud de permiso.
fuente
Bitmap photo = (Bitmap) data.getExtras().get("data");
obtiene una miniatura de la cámara. Hay un artículo sobre cómo almacenar una imagen en un almacenamiento externo desde la cámara. enlace útilfuente
Siga este ejemplo con esta implementación utilizando el soporte de Kotlin y Andoirdx:
Y el resultado de la actividad:
Puede obtener más detalles en https://github.com/joelmmx/take_photo_kotlin.git
¡Espero que te ayude!
fuente