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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 17:41:12