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

如何修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 16:40:52