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

为何Player接口无ExoPlayer的setPauseAtEndOfMediaItems方法?如何实现?

实现媒体项播放结束时暂停/继续的控制方案

因为MediaController获取的Player接口没有暴露setPauseAtEndOfMediaItems方法,你可以通过自定义媒体命令的方式,让MediaController向MediaSession发送指令,由MediaSession调用ExoPlayer的对应方法。具体步骤如下:

1. 定义自定义命令常量

先声明一个唯一的字符串常量,用来标识这个自定义控制命令:

private const val COMMAND_SET_PAUSE_AT_END = "your.package.name.SET_PAUSE_AT_END"

2. 在MediaSession端处理命令

在MediaSession的回调中重写onCommand方法,识别自定义命令后直接操作ExoPlayer:

val mediaSession = MediaSessionCompat(context, "YourSessionTag").apply {
    setCallback(object : MediaSessionCompat.Callback() {
        override fun onCommand(
            command: String?,
            extras: Bundle?,
            resultReceiver: ResultReceiver?
        ): Boolean {
            return when (command) {
                COMMAND_SET_PAUSE_AT_END -> {
                    val shouldPause = extras?.getBoolean("shouldPause", false) ?: false
                    // 这里传入你的ExoPlayer实例
                    exoPlayer.setPauseAtEndOfMediaItems(shouldPause)
                    // 可选:向MediaController返回执行结果
                    resultReceiver?.send(0, Bundle().apply { putBoolean("success", true) })
                    true
                }
                else -> super.onCommand(command, extras, resultReceiver)
            }
        }
    })
    setPlayer(exoPlayer)
}

3. 在MediaController端发送命令

当用户点击控制按钮时,通过MediaController发送自定义命令,携带启用/禁用的参数:

// 假设使用Switch作为控制按钮
pauseAtEndSwitch.setOnCheckedChangeListener { _, isChecked ->
    mediaController.sendCommand(
        COMMAND_SET_PAUSE_AT_END,
        Bundle().apply { putBoolean("shouldPause", isChecked) },
        object : ResultReceiver(Handler(Looper.getMainLooper())) {
            override fun onReceiveResult(resultCode: Int, resultData: Bundle?) {
                // 可选:处理命令执行结果,比如更新UI反馈
            }
        }
    )
}

4. 同步按钮状态(可选)

如果需要让客户端按钮状态和ExoPlayer的当前设置保持一致,可以在MediaSession中同步状态到extras:

// 每次修改设置时更新MediaSession的extras
exoPlayer.setPauseAtEndOfMediaItems(shouldPause)
mediaSession.setExtras(Bundle().apply {
    putBoolean("PAUSE_AT_END_ENABLED", shouldPause)
})

然后在客户端监听MediaController的extras变化,更新按钮状态:

mediaController.registerCallback(object : MediaControllerCompat.Callback() {
    override fun onExtrasChanged(extras: Bundle?) {
        super.onExtrasChanged(extras)
        val isEnabled = extras?.getBoolean("PAUSE_AT_END_ENABLED", false) ?: false
        pauseAtEndSwitch.isChecked = isEnabled
    }
})

内容的提问来源于stack exchange,提问作者Alessandro Scarozza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 12:43:16