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

Android ExoPlayer实现播放列表视频自动播放下一集方案咨询

影视流媒体APP剧集连播功能实现方案

1. 定义剧集数据结构

1.1 后端JSON返回格式

单独设计剧集接口的返回结构,示例如下:

{
  "movie_id": 12345,
  "total_episode": 24,
  "episode_list": [
    {
      "episode_id": 1001,
      "episode_no": 1,
      "episode_title": "第1集 序幕",
      "video_url": "你的视频资源地址",
      "cover_url": "剧集封面地址",
      "duration": 2765,
      "skip_start": 90,
      "skip_end": 2680
    },
    {
      "episode_id": 1002,
      "episode_no": 2,
      "episode_title": "第2集 相遇",
      "video_url": "你的视频资源地址",
      "cover_url": "剧集封面地址",
      "duration": 2698,
      "skip_start": 90,
      "skip_end": 2610
    }
  ]
}

1.2 新增Episode数据模型类

对应JSON结构创建实体类:

public class Episode {
    private int episodeId;
    private int episodeNo;
    private String episodeTitle;
    private String videoUrl;
    private String coverUrl;
    private int duration;
    private int skipStart;
    private int skipEnd;
    private long watchProgress; // 本地存储的观看进度

    // 自动生成所有属性的getter、setter方法
}

2. 实现剧集列表适配器

新建EpisodeAdapter.java适配RecyclerView,核心逻辑如下:

public class EpisodeAdapter extends RecyclerView.Adapter<EpisodeAdapter.EpisodeViewHolder> {
    private List<Episode> episodeList;
    private int currentPlayPos = 0; // 标记当前播放的剧集下标
    private OnEpisodeClickListener clickListener;

    public interface OnEpisodeClickListener {
        void onEpisodeSelected(Episode episode, int position);
    }

    // 构造方法传入剧集列表和点击回调
    public EpisodeAdapter(List<Episode> list, OnEpisodeClickListener listener) {
        this.episodeList = list;
        this.clickListener = listener;
    }

    // 列表项绑定时处理选中态:正在播放的剧集高亮、显示播放中标记
    @Override
    public void onBindViewHolder(@NonNull EpisodeViewHolder holder, int position) {
        Episode item = episodeList.get(position);
        holder.tvEpisodeNo.setText(String.valueOf(item.getEpisodeNo()));
        holder.tvEpisodeTitle.setText(item.getEpisodeTitle());
        if (position == currentPlayPos) {
            holder.itemView.setBackgroundColor(Color.parseColor("#1AFF4081"));
            holder.ivPlayingTag.setVisibility(View.VISIBLE);
        } else {
            holder.itemView.setBackgroundColor(Color.TRANSPARENT);
            holder.ivPlayingTag.setVisibility(View.GONE);
        }
        holder.itemView.setOnClickListener(v -> clickListener.onEpisodeSelected(item, position));
    }

    // 对外提供更新当前播放下标的方法
    public void updateCurrentPlayPos(int newPos) {
        int oldPos = currentPlayPos;
        currentPlayPos = newPos;
        notifyItemChanged(oldPos);
        notifyItemChanged(newPos);
    }

    // ViewHolder创建、getItemCount等常规逻辑自行补充
    static class EpisodeViewHolder extends RecyclerView.ViewHolder {
        TextView tvEpisodeNo, tvEpisodeTitle;
        ImageView ivPlayingTag;
        public EpisodeViewHolder(@NonNull View itemView) {
            super(itemView);
            // 绑定控件id
        }
    }
}

3. 影片详情页改造

3.1 布局调整

在activity_movie_details.xml的播放器下方、影片简介区域之后新增RecyclerView控件,用于展示剧集列表。

3.2 页面逻辑适配

  • 初始化剧集RecyclerView,设置垂直线性布局管理器
  • 进入页面后请求剧集接口,拿到返回数据后初始化Adapter,设置给RecyclerView
  • 实现剧集点击回调:用户手动点击某一集时,直接调用切换播放的方法,更新当前播放下标

4. ExoPlayer自动连播核心逻辑

给ExoPlayer添加播放状态监听,实现自动切集:

private int currentPlayPos = 0;
private List<Episode> episodeList;

// 初始化播放器时添加监听
player.addListener(new Player.Listener() {
    @Override
    public void onPlaybackStateChanged(int playbackState) {
        // 播放结束触发自动切集
        if (playbackState == Player.STATE_ENDED) {
            int nextPos = currentPlayPos + 1;
            if (nextPos < episodeList.size()) {
                switchToEpisode(nextPos);
            }
        }
    }
});

// 公共切换剧集方法,手动点击和自动切集都调用该方法
private void switchToEpisode(int targetPos) {
    Episode targetEpisode = episodeList.get(targetPos);
    // 1. 停止当前播放,替换MediaItem
    player.stop();
    player.setMediaItem(MediaItem.fromUri(targetEpisode.getVideoUrl()));
    // 2. 可选:跳过片头
    player.seekTo(targetEpisode.getSkipStart() * 1000L);
    player.prepare();
    player.play();
    // 3. 更新列表选中态
    currentPlayPos = targetPos;
    episodeAdapter.updateCurrentPlayPos(targetPos);
    episodeRecycler.smoothScrollToPosition(targetPos);
}

5. YouTube式交互优化

  • 播放到剩余3秒时弹出半透明下一集提示浮层,显示下一集标题,提供「立即播放」和「取消」按钮,10秒无操作自动跳转
  • 已播放过的剧集在列表中显示灰色进度条,标记观看进度
  • 切换到未看完的剧集时,弹出二次确认选项:「继续播放」/「从头播放」
  • 新增全局自动连播开关,用户可在设置页关闭自动连播功能

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 16:36:02