La captura de imágenes de Android CameraX en onImageSaved nunca se ejecuta.
Estoy siguiendo algunos tutoriales de camerax y estoy intentando hacer que la captura y el guardado de imagen funcionen, pero la función ‘onImageSaved’ nunca se llama, y aunque puedo obtener una Uri para la ubicación de la imagen, no apunta a nada. He pasado horas intentando depurar esto y no puedo averiguar qué ha salido mal.
He intentado verificar los permisos de acceso al archivo, ese no es el problema.
private fun takePhoto(){
// Obtener una referencia estable del caso de uso de captura de imagen modificable
val imageCapture = imageCapture ?: return
// Crear un archivo de salida con marca de tiempo para contener la imagen
//val photoFile = File(externalMediaDirs[0],"JPEG_${System.currentTimeMillis()}.jpg")
val directory: File = applicationContext.getDir("imageDir", Context.MODE_PRIVATE)
val photoFile = File(directory, "JPEG_${System.currentTimeMillis()}.jpg")
// Crear objeto de opciones de salida que contiene el archivo + metadatos
val outputOptions = ImageCapture.OutputFileOptions.Builder(photoFile).build()
// Convertir la ruta de acceso del archivo en Uri
val imageUri = Uri.fromFile(photoFile)
// Configurar el listener de captura de imagen, que se activa después de que se haya tomado la foto
imageCapture.takePicture(
outputOptions, ContextCompat.getMainExecutor(this), object : ImageCapture.OnImageSavedCallback {
override fun onError(exc: ImageCaptureException) {
Log.e(TAG, "La captura de foto falló: ${exc.message}", exc)
}
override fun onImageSaved(output: ImageCapture.OutputFileResults) {
// TODO Esto nunca se ejecuta
val msg = "Captura de foto exitosa: $imageUri"
Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show()
Log.d(TAG, msg)
}
})
// Enviar nuestra Uri de imagen de regreso a la aplicación de demostración y finalizar esta actividad
val intent = Intent()
intent.putExtra("ImageUri", imageUri)
runOnUiThread {
setResult(2, intent)
finish()
}
}
davy.ai
Hay algunas posibles razones por las cuales la función ‘onImageSaved’ no se llama y el Uri no apunta a nada:
Opciones de archivo de salida incorrectas: Verifica si las opciones de archivo de salida son correctas, ya que determinan dónde se guardará la imagen. Es mejor utilizar rutas de archivo absolutas en lugar de relativas, y asegurarse de que el directorio donde se está guardando la imagen exista.
El oyente de captura de imagen no está configurado correctamente: Verifica si el oyente de captura de imagen está configurado correctamente, ya que es responsable de activar la función ‘onImageSaved’ después de que se haya tomado la foto. Asegúrate de que el oyente se esté pasando como parámetro a ‘takePicture’, y que sea una instancia de ‘OnImageSavedCallback’.
Error en la función ‘onError’: Si hay un error en la función ‘onError’, puede impedir que se llame la función ‘onImageSaved’. Verifica si hay algún error registrado por la función ‘onError’ y soluciónalo si es necesario.
Problemas de permisos: Aunque se hayan verificado los permisos de acceso a archivos, aún puede haber problemas con los permisos de archivos en ciertos dispositivos. Asegúrate de que la aplicación tenga permiso para escribir en el almacenamiento externo y que el almacenamiento no esté lleno.
Verificar estas áreas debe ayudar a resolver el problema de que la función ‘onImageSaved’ no se llama y el Uri no apunta a nada.