如何在Media3中禁用时长显示?
用Media3实现后台播放隐藏时长的可行方案
你之前尝试移除COMMAND_GET_TIMELINE和COMMAND_GET_TRACKS没生效,是因为系统媒体通知不仅会检查可用命令,还会直接从Player的Timeline和MediaMetadata中读取时长信息。要彻底隐藏时长,需要从Player Timeline拦截和MediaMetadata配置两方面入手:
1. 包装ExoPlayer,拦截Timeline返回的时长
创建一个自定义的ForwardingPlayer,重写getTimeline()方法,将所有窗口的时长设为未知:
import androidx.media3.common.C import androidx.media3.common.Timeline import androidx.media3.common.Window import androidx.media3.exoplayer.ForwardingPlayer import androidx.media3.exoplayer.ForwardingTimeline class NoDurationPlayer(wrappedPlayer: Player) : ForwardingPlayer(wrappedPlayer) { override fun getTimeline(): Timeline { return object : ForwardingTimeline(super.getTimeline()) { override fun getWindow(windowIndex: Int, window: Window, defaultPositionProjectionUs: Long): Boolean { val result = super.getWindow(windowIndex, window, defaultPositionProjectionUs) // 将时长标记为未知,系统就不会显示时长 window.durationMs = C.TIME_UNSET return result } } } }
初始化Player时用这个包装类替代原生ExoPlayer:
val exoPlayer = ExoPlayer.Builder(context).build() val player = NoDurationPlayer(exoPlayer)
2. 配置MediaMetadata时不设置时长
设置媒体项的元数据时,不要调用setDuration(),避免系统从元数据中读取时长:
val mediaMetadata = MediaMetadata.Builder() .setTitle("歌曲名称") .setArtist("歌手名称") // 省略setDuration(),不提供时长信息 .build() val mediaItem = MediaItem.Builder() .setUri("音频文件URI") .setMediaMetadata(mediaMetadata) .build() player.setMediaItem(mediaItem)
3. 保留你之前的MediaSession命令配置
继续移除相关命令,防止外部控制器主动获取时长信息:
val mediaSession = MediaSession.Builder(context, player).build() val connectionResult = MediaSession.ConnectionResult.AcceptedResultBuilder(mediaSession) .setAvailablePlayerCommands( MediaSession.ConnectionResult.DEFAULT_PLAYER_COMMANDS.buildUpon() .remove(COMMAND_GET_TIMELINE) .remove(COMMAND_GET_TRACKS) .build() ) .build()
这样处理后,系统媒体通知就不会显示时长了——既拦截了Player层面的时长返回,也没有提供元数据时长,同时限制了外部命令获取时长的权限。
内容的提问来源于stack exchange,提问作者Evan
相关产品推荐
相关产品推荐

