如何在ExoPlayer中检测播放/暂停操作并同步更新UI
ExoPlayer播放/暂停状态检测与UI同步解决方法
问题根源
你使用的Player.DefaultEventListener已被ExoPlayer标记为过时,后续版本的状态回调逻辑已拆分,导致原有代码无法准确响应播放/暂停操作。以下是可行的解决方案:
替换为最新的Listener实现
直接使用Player.Listener接口,通过拆分的回调方法精准监听播放状态切换:
player.addListener(new Player.Listener() { // 监听播放/暂停状态切换(playWhenReady变化) @Override public void onPlayWhenReadyChanged(boolean playWhenReady, int reason) { // 立即同步UI状态 syncPlayerUI(playWhenReady); } // 监听播放阶段变化(如就绪、缓冲、结束) @Override public void onPlaybackStateChanged(int playbackState) { // 媒体就绪时,确保UI与当前播放状态一致 if (playbackState == Player.STATE_READY) { syncPlayerUI(player.getPlayWhenReady()); } } });
确保UI更新在主线程执行
所有UI操作必须在主线程完成,避免异常或不生效:
private void syncPlayerUI(boolean isPlaying) { runOnUiThread(() -> { // 更新本地播放按钮 playPauseBtn.setImageResource(isPlaying ? R.drawable.ic_pause : R.drawable.ic_play); // 同步更新通知管理器内容 yourNotificationManager.updatePlayState(isPlaying); }); }
额外排查点
- 确认
player实例全局唯一,未被重复创建或提前销毁导致Listener失效; - 检查是否在生命周期方法(如
onDestroy)中误移除了Listener; - 若使用ExoPlayer自带的媒体通知,需确保通知的播放/暂停按钮点击事件能正确同步到
player.setPlayWhenReady(),形成双向同步。
内容的提问来源于stack exchange,提问作者Garvit
相关产品推荐
相关产品推荐

