Android Media3播放器如何阻止播放列表自动跳转至下一项?
解决Media3播放列表单媒体项播放完毕后暂停的问题
你当前设置Player.REPEAT_MODE_OFF的行为是播放完整个列表后停止,但单媒体项播放完毕会自动跳转到下一项并继续播放(如果playWhenReady为true)。要实现每个媒体项播放完毕后暂停,等待用户手动触发下一项,可以通过监听播放器的自动跳转事件来拦截并暂停,具体实现如下:
方法:监听播放器的自动媒体项跳转事件
给ExoPlayer注册Player.Listener,拦截自动跳转行为并暂停播放器,同时回到刚播放完成的媒体项位置:
// 记录当前正在播放的媒体项索引 private var currentPlayingItemIndex = -1 player.addListener(object : Player.Listener { override fun onMediaItemTransition(mediaItem: MediaItem?, reason: Int) { super.onMediaItemTransition(mediaItem, reason) // 拦截自动跳转下一项的行为 if (reason == Player.MEDIA_ITEM_TRANSITION_REASON_AUTO) { player.pause() // 回到刚播放完成的媒体项(如果索引有效) if (currentPlayingItemIndex >= 0) { player.seekTo(currentPlayingItemIndex, C.TIME_UNSET) } } else { // 手动跳转、初始化等场景,更新当前播放索引 currentPlayingItemIndex = player.currentMediaItemIndex } } override fun onPlaybackStateChanged(playbackState: Int) { super.onPlaybackStateChanged(playbackState) // 播放器准备就绪并开始播放时,记录当前媒体项索引 if (playbackState == Player.STATE_READY && player.playWhenReady) { currentPlayingItemIndex = player.currentMediaItemIndex } } })
补充说明
- 该逻辑会拦截所有自动跳转下一项的行为(包括播放完当前项后的自动跳转),暂停播放器并保留在刚播放完成的媒体项位置。
- 用户点击媒体会话或UI上的「下一项」按钮时,属于手动触发的跳转(
reason不为MEDIA_ITEM_TRANSITION_REASON_AUTO),会正常切换到下一项并播放。 - 如果你希望播放完媒体项后停留在该项目的结尾,无需额外调用
seekTo,暂停后播放器会自然停在结尾位置;如果需要回到项的开头,可以将C.TIME_UNSET替换为0L。
内容的提问来源于stack exchange,提问作者Stefan
相关产品推荐
相关产品推荐

