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
完全接管通知的构建逻辑,强制使用自定义封面,忽略媒体项中的内嵌封面:
- 实现自定义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() } }
- 初始化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
相关产品推荐
相关产品推荐

