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
相关产品推荐
相关产品推荐

