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.

El color de contraste de la notificación está equivocado en Android 12. ¿Cómo arreglar esto?

Para destacar mi notificación adjunta a un servicio en primer plano, he estado estableciendo el color de la notificación. En Android 11 y versiones inferiores, el sistema asigna automáticamente los colores de los botones según el color. Sin embargo, en Android 12, independientemente del color que use, los textos, los botones, los títulos, etc., siguen siendo oscuros. Entonces, ¿cómo puedo establecer el tema en modo oscuro para que los botones se vuelvan blancos?

Este es mi código constructor de notificaciones:

NotificationCompat.Builder(this, MaplocsNotificationChannels.FOLLOW_LOCATION.channelId)
        .addAction(R.drawable.ic_stat_ic_notification, getString(R.string.generic_word_show),
                activityPendingIntent)
        .addAction(R.drawable.ic_stat_ic_notification, getString(R.string.navigation_mode_stop),
                servicePendingIntent)
        .setContentText(
                navigationStep?.getFormattedDistanceText(this)
                        ?: getString(R.string.navigation_mode_notification_message))
        .setContentTitle(navigationStep?.instruction
                ?: getString(R.string.generic_word_navigate_route))
        .setOngoing(true)
        .setColor(ContextCompat.getColor(this, R.color.primaryColor))
        .setColorized(true)
        .setSilent(true)
        .setContentIntent(activityPendingIntent)
        .setLargeIcon(
                if (navigationStep != null)
                    getBitmapFromVectorDrawable(navigationStep.getIconId()).apply {
                        changeColor(Color.WHITE)
                    }
                else null
        )
        .setPriority(NotificationCompat.PRIORITY_HIGH)
        .setSmallIcon(R.drawable.ic_stat_ic_notification)
        .setWhen(System.currentTimeMillis())
        .build()

En Android 11 y versiones inferiores, el sistema cambia automáticamente los colores de los botones en función del color de la notificación builder.setColor(). En Android 12, sin embargo, los colores de los botones y los textos permanecen iguales independientemente del color de la notificación.

La razón de este cambio es que el cálculo del contraste ha cambiado en Android 12. Si establezco el color en #424242, un color mucho más oscuro, entonces el texto se vuelve blanco. La única pregunta es cómo hacer esto manualmente.

He investigado el código fuente de Android y encontré que la fuente del problema es la clase ContrastColorUtil.java. Si la notificación tiene un color de fondo no predeterminado, la clase Notification.Builder() llama al método shouldUseDark(). Este método determina, en función del color de fondo, si la notificación debe utilizar colores oscuros o claros en los elementos de la notificación. En Android 12, la definición de este método ha cambiado.

No entiendo la lógica detrás del cálculo del valor de luminancia de un color, pero el valor constante que se supone debe ser un valor intermedio ha cambiado de 0.5 a 0.17912878474 en Android 12. Este es el origen del problema.

Dado que este código no se puede cambiar y no hay un método público para establecer el tema de la notificación, la única solución que veo para solucionar este problema es utilizar la reflexión para manipular el valor interno privado en la instancia de la Notificación. El problema de hacer esto es que la mayoría de los valores de la notificación se establecen en los métodos de Notification.Builder(), por lo que tendríamos que cambiar muchos elementos (título, mensaje, color del icono, colores de botones, etc.) en la notificación para solucionar el problema por completo.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Configuración del tema de notificación para Android 12

    Para configurar el tema de notificaciones en Android 12, es necesario entender que el algoritmo para calcular el contraste entre el color de la notificación y los colores del botón/texto ha cambiado. Por lo tanto, simplemente cambiar el color a una tonalidad más clara no funcionará. En su lugar, necesitamos establecer un color mucho más oscuro para que los botones y textos aparezcan en blanco.

    Sin embargo, no hay ningún método público disponible para establecer el tema de notificación, y cambiar el valor interno mediante reflexión no es una solución completa ya que tendríamos que cambiar muchos elementos en la notificación para solucionarlo por completo.

    Por lo tanto, actualmente, la única opción disponible es establecer un color mucho más oscuro para conseguir que los botones y textos aparezcan en blanco. Esto se puede lograr modificando el valor de color pasado al método builder.setColor() para establecer un color más oscuro.

    Investigando más el código fuente de Android, se descubrió que la lógica para determinar si se debe utilizar un tema oscuro o claro basado en el color de notificación está presente en la clase ContrastColorUtil.java. Sin embargo, el valor constante que se supone debe ser un valor intermedio se cambió de 0.5 a 0.17912878474 en Android 12, causando el problema.

    Por lo tanto, hasta que haya una solución mejor disponible, establecer un color mucho más oscuro es el mejor enfoque para hacer que los botones/textos aparezcan en blanco en las notificaciones.

Comments are closed.