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

Media3 ExoPlayer显示内嵌封面而非自定义元数据封面如何解决?

解决Media3默认通知替换自定义封面的问题

方法一:清除MediaItem中的内嵌封面元数据

直接在构建MediaItem时,移除原始媒体元数据里的内嵌封面,只保留你设置的自定义封面URI,从根源上避免默认通知加载内嵌封面:

// 假设originalMetadata是从媒体文件解析出的原始元数据
val customMetadata = MediaMetadata.Builder(originalMetadata)
    .setArtworkUri(null) // 清除内嵌封面
    .setArtworkUri(yourCustomCoverUri) // 设置自定义封面
    .build()

val mediaItem = MediaItem.Builder()
    .setUri(songUri)
    .setMediaMetadata(customMetadata)
    .build()

方法二:自定义MediaNotificationProvider

完全接管通知的构建逻辑,强制使用自定义封面,忽略媒体项中的内嵌封面:

  1. 实现自定义Provider类:
class CustomMediaNotificationProvider(context: Context) : DefaultMediaNotificationProvider(context) {
    override fun createNotification(
        mediaSession: MediaSession,
        mediaItem: MediaItem?,
        playWhenReady: Boolean,
        playbackState: Int,
        showPauseButton: Boolean,
        compactViewEnabled: Boolean,
    ): Notification {
        // 加载自定义封面Bitmap(根据你的URI实现加载逻辑)
        val customCoverBitmap = BitmapFactory.decodeStream(
            context.contentResolver.openInputStream(yourCustomCoverUri)
        )

        return NotificationCompat.Builder(context, YOUR_NOTIFICATION_CHANNEL_ID)
            .setStyle(androidx.media.app.NotificationCompat.MediaStyle()
                .setMediaSession(mediaSession.sessionToken)
                .setShowActionsInCompactView(0, 1))
            .setSmallIcon(R.drawable.ic_notification_small)
            .setLargeIcon(customCoverBitmap)
            .setContentTitle(mediaItem?.mediaMetadata?.title ?: "未知歌曲")
            .setContentText(mediaItem?.mediaMetadata?.artist ?: "未知歌手")
            .setContentIntent(mediaSession.sessionActivity)
            .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
            .addAction(
                if (playWhenReady) R.drawable.ic_pause else R.drawable.ic_play,
                if (playWhenReady) "暂停" else "播放",
                mediaSession.controller.playPauseAction
            )
            // 添加上一曲、下一曲等其他操作按钮
            .addAction(R.drawable.ic_previous, "上一曲", mediaSession.controller.skipToPreviousAction)
            .addAction(R.drawable.ic_next, "下一曲", mediaSession.controller.skipToNextAction)
            .build()
    }
}
  1. 初始化MediaSession时绑定自定义Provider:
val mediaSession = MediaSession.Builder(context, player)
    .setMediaNotificationProvider(CustomMediaNotificationProvider(context))
    .build()

方法三:拦截通知更新替换封面

通过MediaNotification.Callback拦截默认通知的更新,替换其中的大图标为自定义封面:

mediaSession.setMediaNotificationCallback(object : MediaNotification.Callback {
    override fun onNotificationChanged(notification: Notification, reason: Int) {
        val customCoverBitmap = BitmapFactory.decodeStream(
            context.contentResolver.openInputStream(yourCustomCoverUri)
        )
        // 基于原始通知修改封面
        val updatedNotification = NotificationCompat.Builder(context, YOUR_NOTIFICATION_CHANNEL_ID)
            .setStyle(notification.style)
            .setSmallIcon(notification.smallIcon)
            .setLargeIcon(customCoverBitmap)
            .setContentTitle(notification.extras.getCharSequence(Notification.EXTRA_TITLE))
            .setContentText(notification.extras.getCharSequence(Notification.EXTRA_TEXT))
            .setContentIntent(notification.contentIntent)
            .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
            .addActions(notification.actions.orEmpty())
            .build()
        // 更新通知
        mediaSession.updateNotification(updatedNotification)
    }
})

内容的提问来源于stack exchange,提问作者Sudhanshu Dubey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 09:45:07