如何修改Media3自动生成的媒体通知并添加标题与副标题?
解决Media3自动通知无标题/副标题的问题
嘿,我来帮你搞定这个困扰!其实问题核心很简单:Media3自动生成的通知是依赖MediaMetadata(媒体元数据)来展示标题、副标题这些信息的,你之前的代码里完全没给播放的MediaItem设置元数据,所以通知里才没有这些内容。下面是具体的解决步骤和修改示例:
方法一:给MediaItem添加元数据(最推荐)
你可以在onAddMediaItems方法里,更新MediaItem的时候直接带上元数据。如果你的电台信息是动态的(比如从网络接口获取),也可以在构建MediaItem的时候传入这些信息:
override fun onAddMediaItems(mediaSession: MediaSession, controller: MediaSession.ControllerInfo, mediaItems: MutableList<MediaItem>): ListenableFuture<MutableList<MediaItem>> { val updatedMediaItems = mediaItems.map { mediaItem -> mediaItem.buildUpon() .setUri(mediaItem.mediaId) // 这里添加媒体元数据,替换成你的电台实际信息 .setMediaMetadata(MediaMetadata.Builder() .setTitle("City FM 城市音乐台") // 通知标题 .setSubtitle("正在播放:2024流行金曲榜") // 通知副标题 // 可选:添加封面图,让通知更丰富 // .setArtworkUri(Uri.parse("https://your-radio.com/cover.jpg")) .build()) .build() }.toMutableList() return Futures.immediateFuture(updatedMediaItems) }
当你设置好元数据后,MediaSession会自动把这些信息同步到系统生成的通知里,不需要手动更新通知。
方法二:动态更新元数据(适合播放中切换内容)
如果你的电台是实时切换节目内容的,可以在播放过程中随时更新当前MediaItem的元数据,通知会自动刷新:
// 比如在节目切换时调用这个方法 fun updateRadioMetadata(title: String, subtitle: String) { val currentMediaItem = LC.exoPlayer.currentMediaItem ?: return val updatedMediaItem = currentMediaItem.buildUpon() .setMediaMetadata(MediaMetadata.Builder() .setTitle(title) .setSubtitle(subtitle) .build()) .build() // 更新ExoPlayer的当前MediaItem,保留播放进度 LC.exoPlayer.setMediaItem(updatedMediaItem, true) }
关于你尝试的onUpdateNotification
如果你想用这个方法自定义通知,也是可以的,但这属于进阶操作。默认情况下,只要设置好MediaMetadata,系统自动生成的通知就会正常显示标题和副标题。如果确实需要完全自定义通知样式,你可以给MediaSession设置NotificationProvider:
// 在onCreate里添加这段代码 LC.mediaSession.setNotificationProvider(object : MediaSession.NotificationProvider { override fun createNotification( session: MediaSession, customLayout: ImmutableList<CommandButton>, actionFactory: MediaNotification.ActionFactory, onNotificationChangedCallback: MediaSession.NotificationProvider.OnNotificationChangedCallback ): MediaNotification { // 构建自定义通知 val notification = NotificationCompat.Builder(this@PlaybackService, "YOUR_NOTIFICATION_CHANNEL_ID") .setContentTitle("自定义电台标题") .setContentText("自定义副标题") .setSmallIcon(R.drawable.ic_radio_notification) // 替换成你的通知图标 // 添加播放/暂停等控制按钮 .addAction(actionFactory.createAction(PlaybackCommand.COMMAND_PAUSE)) .addAction(actionFactory.createAction(PlaybackCommand.COMMAND_PLAY)) .setStyle(androidx.media.app.NotificationCompat.MediaStyle() .setMediaSession(session.sessionToken)) .build() return MediaNotification(1001, notification) } })
注意:使用自定义通知前,别忘了创建对应的通知渠道哦!
内容的提问来源于stack exchange,提问作者István
相关产品推荐
相关产品推荐

