为何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
相关产品推荐
相关产品推荐

