Android 12通知对比度异常,自定义背景色后文字按钮仍为深色如何修复
Android 12+ 自定义通知配色适配方案
方案1:调整通知背景色亮度(优先推荐,无兼容风险)
根据你找到的Android 12阈值规则,只要将setColor传入的颜色亮度调整到低于0.1791,系统就会自动将通知文字、按钮切换为白色配色,不需要修改其他逻辑,同时兼容旧版本系统。
可以在设置颜色前先计算目标颜色的亮度,不符合要求时自动调暗:
fun calculateLuminance(color: Int): Double { val red = Color.red(color) / 255.0 val green = Color.green(color) / 255.0 val blue = Color.blue(color) / 255.0 val r = if (red < 0.03928) red / 12.92 else Math.pow((red + 0.055) / 1.055, 2.4) val g = if (green < 0.03928) green / 12.92 else Math.pow((green + 0.055) / 1.055, 2.4) val b = if (blue < 0.03928) blue / 12.92 else Math.pow((blue + 0.055) / 1.055, 2.4) return 0.2126 * r + 0.7152 * g + 0.0722 * b } // 使用时判断系统版本调整颜色 val targetColor = ContextCompat.getColor(this, R.color.primaryColor) val finalColor = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { var adjustedColor = targetColor while (calculateLuminance(adjustedColor) > 0.17912878474) { // 每次降低10%亮度,直到符合阈值 adjustedColor = ColorUtils.blendARGB(adjustedColor, Color.BLACK, 0.1f) } adjustedColor } else { targetColor } // 传入调整后的颜色 builder.setColor(finalColor)
该方案完全使用公开API,没有适配风险,对原有代码侵入性最低。
方案2:完全自定义通知布局(次选,样式完全可控)
如果不想调整品牌色的显示效果,可以通过RemoteViews自定义通知的全部布局,自己指定文字、按钮、图标的颜色,不受系统对比度规则限制:
- 首先创建自定义通知布局XML,比如
layout/custom_notification.xml,自行设置各元素的颜色、大小 - 构建通知时绑定布局:
val remoteViews = RemoteViews(packageName, R.layout.custom_notification).apply { setTextViewText(R.id.notification_title, navigationStep?.instruction ?: getString(R.string.generic_word_navigate_route)) setTextViewText(R.id.notification_content, navigationStep?.getFormattedDistanceText(this) ?: getString(R.string.navigation_mode_notification_message)) // 自定义设置文字颜色为白色 setTextColor(R.id.notification_title, Color.WHITE) setTextColor(R.id.notification_content, Color.WHITE) // 设置按钮点击事件 setOnClickPendingIntent(R.id.btn_show, activityPendingIntent) setOnClickPendingIntent(R.id.btn_stop, servicePendingIntent) } builder.setCustomContentView(remoteViews) // 如需展开样式也可以设置setCustomBigContentView
注意自定义布局需要适配不同系统的通知内边距,避免内容显示不全。
方案3:反射修改内部参数(不推荐,仅作备选)
如果前两个方案都无法满足需求,才考虑反射方案,该方案存在厂商定制兼容问题、系统版本升级字段变更导致失效的风险:
反射的核心是修改Notification实例中控制系统配色的内部字段,或者修改extras bundle中存储的颜色参数,强制系统使用浅色文字配置。
内容的提问来源于stack exchange,提问作者vepzfe
相关产品推荐
相关产品推荐

