You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MediaSessionCompat出现两条重复锁屏通知该如何解决?

问题根本原因

锁屏出现两条媒体通知的核心原因是:你自行通过NotificationCompat.Builder构建并弹出了自定义媒体通知,同时激活状态的MediaSessionCompat未和你的自定义通知绑定,系统会自动生成单独的锁屏媒体控制通知,二者叠加就出现了重复展示的问题。你之前设置VISIBILITY_SECRET不生效,是因为没有从根源上阻断系统生成额外通知的逻辑。

解决方案

  • 给自定义通知的MediaStyle绑定MediaSession的token,这一步是告知系统直接复用你构建的通知作为锁屏媒体控制通知,不需要额外生成新通知,是解决重复问题的核心逻辑。
  • 所有媒体控制通知统一使用固定的通知ID,通过前台服务startForeground()方法展示通知,不要单独调用NotificationManager.notify()弹同类型的媒体通知。播放状态变化时,用同一个ID更新通知即可。
  • 按需求设置单条通知的锁屏可见性,单条通知的setVisibility配置优先级高于通知渠道的全局配置,不需要设置VISIBILITY_SECRET,如果要隐藏通知内容可设置为VISIBILITY_PRIVATE,要展示完整控制按钮可设置为VISIBILITY_PUBLIC。

核心实现代码示例

// 固定常量定义
const val CHANNEL_ID = "music_play_channel"
const val NOTIFICATION_ID = 1001

// 构建通知时绑定MediaSession token
val notification = NotificationCompat.Builder(context, CHANNEL_ID)
    .setSmallIcon(R.drawable.ic_music_note)
    .setContentTitle("正在播放")
    .setContentText(currentSongName)
    // 添加播放、暂停、快退等自定义控制按钮
    .addAction(R.drawable.ic_rewind, "快退", rewindPendingIntent)
    .addAction(R.drawable.ic_pause, "暂停", pausePendingIntent)
    .addAction(R.drawable.ic_play, "播放", playPendingIntent)
    // 绑定MediaSession,避免系统生成重复通知
    .setStyle(androidx.media.app.NotificationCompat.MediaStyle()
        .setMediaSession(mediaSession.sessionToken)
        .setShowActionsInCompactView(0, 1, 2) // 紧凑模式下展示的按钮索引
    )
    .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
    .setContentIntent(openPlayerPendingIntent)
    .build()

// 启动前台服务展示通知,使用固定通知ID
startForeground(NOTIFICATION_ID, notification)

// 激活MediaSession同步控制逻辑
mediaSession.isActive = true

排查项

如果配置后仍出现重复通知,检查是否存在以下问题:

  • 未调用mediaSessionCompat.setActive(true)激活MediaSession,导致绑定逻辑不生效
  • 其他业务逻辑中用不同的通知ID重复弹出了媒体类型的通知
  • 使用了过时的MediaSession相关API,未导入AndroidX的media兼容包

问题原图

问题截图

内容的提问来源于stack exchange,提问作者Janey Springs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 07:15:05