You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android 10 Media Style通知进度条颜色无法修改问题求助

解决Android Media Style通知进度条颜色无法修改的问题

我完全懂你现在的头疼——Android 10+新增的Media Style通知进度条,明明已经用Media Session实现了播放控制,可进度条颜色就是顽固的黑色,改应用主题也半点用没有。其实问题出在:Media Style通知的进度条颜色并不继承应用的Activity主题,而是需要你在构建通知时显式配置通知自身的颜色属性

为什么修改AppTheme无效?

你的AppTheme里的colorAccent或者其他颜色属性,只会作用于应用内的Activity、控件等UI元素,而通知是属于系统级别的UI组件,它的样式规则和应用主题是分离的,所以调整应用主题根本影响不到通知里的进度条颜色。

正确的解决步骤

1. 构建通知时显式设置颜色并开启Colorized

在创建NotificationCompat.Builder的时候,必须调用setColor()指定你想要的颜色,同时开启setColorized(true)——这一步是关键,没有开启colorized的话,设置的颜色不会生效。

示例代码(Kotlin):

val mediaNotificationBuilder = NotificationCompat.Builder(context, MEDIA_CHANNEL_ID)
    .setSmallIcon(R.drawable.ic_media_notification)
    .setContentTitle("正在播放:《XXX》")
    .setContentText("歌手:XXX")
    // 设置进度条及控制按钮的颜色
    .setColor(ContextCompat.getColor(context, R.color.your_target_color))
    // 必须开启这个才能让自定义颜色生效
    .setColorized(true)
    // 绑定MediaSession
    .setStyle(NotificationCompat.MediaStyle()
        .setMediaSession(mediaSession.sessionToken)
        .setShowActionsInCompactView(0, 1)) // 显示常用控制按钮(播放/暂停、上一首等)
    .setPriority(NotificationCompat.PRIORITY_HIGH)

如果是Java代码:

NotificationCompat.Builder mediaNotificationBuilder = new NotificationCompat.Builder(context, MEDIA_CHANNEL_ID)
        .setSmallIcon(R.drawable.ic_media_notification)
        .setContentTitle("正在播放:《XXX》")
        .setContentText("歌手:XXX")
        .setColor(ContextCompat.getColor(context, R.color.your_target_color))
        .setColorized(true)
        .setStyle(new NotificationCompat.MediaStyle()
                .setMediaSession(mediaSession.getSessionToken())
                .setShowActionsInCompactView(0, 1))
        .setPriority(NotificationCompat.PRIORITY_HIGH);

2. 检查Android O及以上的通知渠道配置

对于Android 8.0(API 26)及以上版本,你需要先创建通知渠道,虽然渠道的颜色主要作用于通知指示灯,但确保渠道配置没有冲突也是必要的:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    val mediaChannel = NotificationChannel(
        MEDIA_CHANNEL_ID,
        "媒体播放通知",
        NotificationManager.IMPORTANCE_HIGH
    ).apply {
        description = "用于音乐播放控制的通知"
        setShowBadge(false)
        // 可选:设置通知指示灯颜色
        lightColor = ContextCompat.getColor(context, R.color.your_target_color)
        enableLights(true)
    }
    val notificationManager = context.getSystemService(NotificationManager::class.java)
    notificationManager.createNotificationChannel(mediaChannel)
}

额外注意事项

  • 如果设置后进度条还是黑色,检查一下你指定的颜色是否是系统能识别的有效颜色资源,避免使用透明或者接近黑色的颜色。
  • Android 12及以上版本,setColorized()默认是true,但为了兼容性,还是建议显式声明。
  • 进度条的颜色会和通知控制按钮(播放、暂停等)的颜色保持一致,这是系统的统一设计。

内容的提问来源于stack exchange,提问作者Amit Bhandari

火山引擎 最新活动