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.

¿Por qué las imágenes locales guardadas en la base de datos de Room no se muestran después de reiniciar la aplicación?

Guardo las URI como cadenas en la base de datos de Room, luego la aplicación recupera los datos y muestra todas las imágenes en LazyVerticalGrid. Cuando agrego imágenes, todo funciona bien, todas las imágenes se muestran correctamente. El problema es cuando reinicio la aplicación. Todas las imágenes desaparecen y cuando agrego la misma imagen exactamente (con la misma URI), aparece en la primera posición, pero también en todas las posiciones anteriores a reiniciar la aplicación. Cuando reviso los registros, todas las URI también se recuperan correctamente de la base de datos en el formato:

content://com.android.providers.media.documents/document/image%3A9371

Aquí está el código para mostrar la imagen (usando coil):

@Composable
fun ProfilePhotoView(photo: String, navController: NavHostController) {
    Image(
        painter = rememberImagePainter(photo),
        contentDescription = null,
        contentScale = ContentScale.Crop,
        modifier = Modifier
            .aspectRatio(1f)
            .padding(3.dp)
            .clip(RoundedCornerShape(10.dp))
            .clickable {},
        alignment = Alignment.Center
    )
    Log.i(TAG,"photo string = ${photo}")
}

Y así es como obtengo una URI antes de agregarla a la base de datos:

val selectImagelauncher = rememberLauncherForActivityResult(
        contract =
        ActivityResultContracts.GetContent()
    ) { uri: Uri? ->
        imageUriState = uri
    }
selectImagelauncher.launch("image/*")

¿Tienes alguna idea de por qué no puedo mostrar imágenes con la “vieja” URI antes de agregar la misma imagen a la base de datos?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema podría estar relacionado con el mecanismo de almacenamiento en caché de la biblioteca de carga de imágenes (Coil). Cuando se agrega una nueva imagen, es posible que la biblioteca almacene en caché la imagen con el mismo URI, por lo que aparece en todas las posiciones antes de reiniciar la aplicación.

    Para solucionar este problema, puedes intentar agregar una clave única a cada imagen al solicitarla con Coil. Puedes usar el URI como clave para que la biblioteca vuelva a obtener la imagen desde la fuente cuando se solicite. Aquí tienes una versión actualizada de la función ProfilePhotoView:

    @Composable
    fun ProfilePhotoView(photo: String, navController: NavHostController) {
        Image(
            painter = rememberImagePainter(
                data = photo,
                builder = {
                    // Use el URI como clave para evitar problemas de almacenamiento en caché
                    diskCacheKey(photo)
                }
            ),
            contentDescription = null,
            contentScale = ContentScale.Crop,
            modifier = Modifier
                .aspectRatio(1f)
                .padding(3.dp)
                .clip(RoundedCornerShape(10.dp))
                .clickable {},
            alignment = Alignment.Center
        )
        Log.i(TAG,"cadena de foto = ${photo}")
    }
    

    Esto asegurará que la biblioteca vuelva a obtener la imagen desde la fuente cuando se solicite, incluso si tiene el mismo URI que una imagen que se almacenó en caché anteriormente.

Comments are closed.