Tengo una aplicación para Android que contiene múltiples actividades.
En uno de ellos estoy usando un botón que llamará a la cámara del dispositivo:
public void onClick(View view) {
Intent photoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(photoIntent, IMAGE_CAPTURE);
}
En la misma actividad, llamo al OnActivityResult
método para el resultado de la imagen:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == IMAGE_CAPTURE) {
if (resultCode == RESULT_OK) {
Bitmap image = (Bitmap) data.getExtras().get("data");
ImageView imageview = (ImageView) findViewById(R.id.pic);
imageview.setImageBitmap(image);
} else if (resultCode == RESULT_CANCELED) {
Toast.makeText(this, "CANCELED ", Toast.LENGTH_LONG).show();
}
}
}
El problema es que la intención data
es nula y el OnActivityResult
método se dirige directamente a (resultCode == RESULT_CANCELED)
y la aplicación vuelve a la actividad anterior.
¿Cómo puedo solucionar este problema y después de llamar a la cámara, la aplicación vuelve a la actividad actual que contiene una ImageView
que contiene la imagen tomada?
Gracias
android
android-camera
android-imageview
soft_developer
fuente
fuente
Respuestas:
La aplicación de cámara de Android predeterminada devuelve una intención no nula solo cuando devuelve una miniatura en la intención devuelta. Si pasa
EXTRA_OUTPUT
con un URI para escribir, devolverá unanull
intención y la imagen está en el URI que pasó.Puede verificar esto mirando el código fuente de la aplicación de la cámara en GitHub:
https://github.com/android/platform_packages_apps_camera/blob/gingerbread-release/src/com/android/camera/Camera.java#L1186
Supongo que estás pasando de
EXTRA_OUTPUT
alguna manera, o la aplicación de la cámara en tu teléfono funciona de manera diferente.fuente
Encontré una respuesta fácil. ¡¡funciona!!
si desea recortar y escalar esta imagen
fuente
FileUriExposedException
a las versiones modernas de SDK.He experimentado este problema,
intent
no es nulo pero la información enviada a través de esteintent
no se recibe enonActionActivit()
Esta es una mejor solución usando getContentResolver () :
el
onActivityResult()
conseguir un mapa de bits almacenado por getContentResolver () :Mira mi ejemplo en github:
https://github.com/Jorgesys/TakePicture
fuente
Aplicación de cámara de trabajo simple que evita el problema de intención nula
- todo el código modificado incluido en esta respuesta; cerca del tutorial de Android
He pasado mucho tiempo en este tema, así que decidí crear una cuenta y compartir mis resultados con usted.
El tutorial oficial de Android "Taking Photos Simply" resultó no cumplir lo que prometía. El código provisto allí no funcionaba en mi dispositivo: un Samsung Galaxy S4 Mini GT-I9195 con la versión de Android 4.4.2 / KitKat / API Nivel 19.
Descubrí que el problema principal era la siguiente línea en el método invocado al capturar la foto (
dispatchTakePictureIntent
en el tutorial):Resultó en la intención posteriormente atrapada por
onActivityResult
ser nula.Para resolver este problema, obtuve mucha inspiración de las respuestas anteriores aquí y algunas publicaciones útiles en github (principalmente esta de deepwinter , muchas gracias a él; es posible que desee ver su respuesta en una publicación estrechamente relacionada ).
Siguiendo estos consejos agradables, elegí la estrategia de eliminar la
putExtra
línea mencionada y hacer lo correspondiente para recuperar la imagen tomada de la cámara dentro del método onActivityResult (). Las líneas de código decisivas para recuperar el mapa de bits asociado con la imagen son:Creé una aplicación ejemplar que solo tiene la capacidad de tomar una foto, guardarla en la tarjeta SD y mostrarla. Creo que esto podría ser útil para las personas en la misma situación que yo cuando me topé con este problema, ya que las sugerencias de ayuda actuales se refieren principalmente a publicaciones de Github bastante extensas que hacen lo que se trata pero que no son demasiado fáciles de supervisar para novatos como yo. Con respecto al sistema de archivos que Android Studio crea por defecto al crear un nuevo proyecto, solo tuve que cambiar tres archivos para mi propósito:
activity_main.xml:
MainActivity.java:
AndroidManifest.xml:
Tenga en cuenta que la solución que encontré para el problema también condujo a una simplificación del archivo de manifiesto de Android: los cambios sugeridos por el tutorial de Android en términos de agregar un proveedor ya no son necesarios, ya que no estoy utilizando ninguno en mi código de Java. Por lo tanto, solo unas pocas líneas estándar, principalmente en relación con los permisos, tuvieron que agregarse al archivo de manifiesto.
También podría ser valioso señalar que la importación automática de Android Studio puede no ser capaz de manejar
java.text.SimpleDateFormat
yjava.util.Date
. Tuve que importarlos a ambos manualmente.fuente
¿Probablemente porque tenías algo como esto?
Sin embargo, no debe poner la salida adicional en la intención, porque entonces los datos van al URI en lugar de la variable de datos. Por esa razón, tienes que tomar las dos líneas en el medio, para que tengas
Eso es lo que me causó el problema, espero que haya ayudado.
fuente
El siguiente código funciona para mí:
Y aqui esta el resultado:
fuente
imageReturnedIntent.getData()
valor nulo. Estoy creando la misma intención que la tuya. No ha puesto ningún parámetro adicional.Para acceder a la cámara y tomar fotos y configurar ImageView en Android
Tienes que usar
Uri file = Uri.fromFile(getOutputMediaFile());
para malvavisco.Utilice el siguiente enlace para obtener la ruta
https://androidkennel.org/android-camera-access-tutorial/
fuente
Código de Kotlin que funciona para mí:
Y obtener Resultado:
y no olvides declarar el código de solicitud:
fuente
Después de mucho intentarlo y estudiar, pude resolverlo. Primero, los datos variables de Intent siempre serán nulos, por lo tanto, la comprobación
!null
bloqueará la aplicación durante tanto tiempo que pase un URI para iniciarActivityForResult. Siga el ejemplo a continuación. Usaré Kotlin.Abre la intención de la cámara
} `
Cree createImageFile (). Pero DEBE hacer que la variable imageFilePath sea global. Ejemplo de cómo crearlo está en la documentación oficial de Android y es bastante sencillo
Obtener intención
El método getBytesFromBitmap
Espero que esto ayude.
fuente
Cuando capturaremos la imagen de la cámara en Android, entonces Uri o
data.getdata()
se anula. Tenemos dos soluciones para resolver este problema.Implementaré todos los métodos aquí. Observe y lea atentamente estos:
Primero diré cómo obtener Uri de la imagen de mapa de bits: el código completo es:
Primero capturaremos la imagen a través de Intent que será igual para ambos métodos, por lo que este código lo escribiré solo una vez aquí:
Ahora implementaremos OnActivityResult :-( Esto será igual para los dos métodos anteriores): -
Ahora crearemos todo el método anterior para crear Uri a partir de métodos Image y Cursor a través de clases:
Ahora ruta URI desde la imagen de mapa de bits
\ Uri desde la ruta real de la imagen guardada
fuente
Cuando capturamos la imagen de la cámara en Android entonces
Uri
o sedata.getdata()
vuelve nula. Tenemos dos soluciones para resolver este problema.Así es como recuperar el Uri de la imagen de mapa de bits. Primero capture la imagen a través de Intent que será igual para ambos métodos:
Ahora implemente
OnActivityResult
, que será el mismo para ambos métodos:Ahora cree todos los métodos anteriores para crear el Uri a partir de los métodos de Imagen y Cursor:
Ruta Uri desde la imagen de mapa de bits:
Uri del camino real de la imagen guardada:
fuente