es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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()
    }
}
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Hay algunas posibles razones por las cuales la función ‘onImageSaved’ no se llama y el Uri no apunta a nada:

    1. La captura de imagen se activa después de que la actividad ha finalizado: Asegúrate de que la función ‘takePhoto’ se esté llamando antes de que la actividad finalice, de lo contrario, la función ‘onImageSaved’ no tendrá una oportunidad para ser llamada.
    2. 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.

    3. 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’.

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

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

Comments are closed.