ExoPlayer2中setControlDispatcher弃用后的替代实现方案咨询
ExoPlayer升级后替代
setControlDispatcher的实现方案 针对你遇到的setControlDispatcher被弃用的问题,核心需求是监听播放状态(playWhenReady)的变化并更新isPlaying变量,以下是两种符合ExoPlayer最新版本的替代方案:
方案一:直接监听Player的播放状态回调(推荐)
不需要拦截控制指令,仅监听状态变化的话,直接给Player添加Player.Listener是最简洁的方式,覆盖所有触发playWhenReady变化的场景(包括控制栏点击、代码调用):
// 初始化你的ExoPlayer实例(以SimpleExoPlayer为例) SimpleExoPlayer player = new SimpleExoPlayer.Builder(context).build(); playerView.setPlayer(player); // 添加播放状态监听 player.addListener(new Player.Listener() { @Override public void onPlayWhenReadyChanged(boolean playWhenReady, int reason) { isPlaying = playWhenReady; } });
方案二:用ForwardingPlayer拦截控制指令
如果需要在执行播放/暂停操作前做额外逻辑(比如拦截指令、自定义处理),可以用ForwardingPlayer包裹原始Player,重写对应的方法:
SimpleExoPlayer originalPlayer = new SimpleExoPlayer.Builder(context).build(); ForwardingPlayer forwardingPlayer = new ForwardingPlayer(originalPlayer) { @Override public void setPlayWhenReady(boolean playWhenReady) { // 这里添加你的自定义逻辑 isPlaying = playWhenReady; // 执行原始Player的操作 super.setPlayWhenReady(playWhenReady); } }; // 将包裹后的Player设置给PlayerView playerView.setPlayer(forwardingPlayer);
保留原有其他代码
你原来的播放速度相关代码不受影响,可以继续使用:
StyledPlayerView playerView = root.findViewById(R.id.file_view_exoplayer_view); View playbackSpeedContainer = playerView.findViewById(R.id.player_playback_speed); TextView textPlaybackSpeed = playerView.findViewById(R.id.player_playback_speed_label); textPlaybackSpeed.setText(DEFAULT_PLAYBACK_SPEED);
内容的提问来源于stack exchange,提问作者Coolguy3289
相关产品推荐
相关产品推荐

