检测范围内的暂停/简历



我在github中搜索了两天的这个问题,但我找不到真正的答案。我想在ExoPlayer > 2.x中检测pause / resume的示例。有人可以给我一个例子吗?我检查了onPlayerStateChanged,并且没有解决问题。

onPlayerStateChanged   :   STATE_BUFFERING 
onPlayerStateChanged   :   STATE_READY 

我刚刚从onPlayerStateChanged获得了此日志,这并非在任何时候都调用!

编辑---

请参阅Player.isPlaying()方法,该方法将其作为API。

"而不是必须单独检查这些属性,可以调用player.splay。

https://exoplayer.dev/listening-to-player-events.html#playback-state-changes

---编辑结束

您需要使用player.EventListener检查playWhenReady。埃法勒的播放状态独立于暂停的玩家:

player.addListener(new Player.DefaultEventListener() {
  @Override
  public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
    if (playWhenReady && playbackState == Player.STATE_READY) {
      // media actually playing
    } else if (playWhenReady) {
      // might be idle (plays after prepare()), 
      // buffering (plays when data available) 
      // or ended (plays when seek away from end)
    } else {
      // player paused in any state
    }
  }
});

播放/暂停播放器exoplayer提供

player.setPlayWhenReady(boolean)

带有媒体文件的播放序列的序列序列,该媒体文件永远不会拒绝拒绝,曾经在四个状态中的每个状态中曾经在每个状态中曾经表达/暂停:

Player.STATE_IDLE;
Player.STATE_BUFFERING;
Player.STATE_READY;
Player.STATE_ENDED;

每次播放器需要缓冲时:

Player.STATE_READY;
Player.STATE_BUFFERING;
Player.STATE_READY;

设置PlayWhen Ready不会影响状态。

当您的媒体实际上在玩

时正在播放
playWhenReady && playbackState == Player.STATE_READY

准备就绪时播放。:)

您可以使用此功能:

public boolean isPlaying() {
    return exoPlayer.getPlaybackState() == Player.STATE_READY && exoPlayer.getPlayWhenReady();
}

必须是,由于发布了其他答案,因此在player.eventlistener中提供了一种新方法。[编辑:现在是player.listener,因为player.eventlistener已被弃用]。这对我来说很好:

override fun onIsPlayingChanged(isPlaying: Boolean) {
    // your code here
}

如果iSplaying是错误的,则暂停了,否则播放。

我也有相同的要求,以检测单击事件的exoplayer play/暂停按钮。上述答案主要是在谈论国家而不是 关于按钮点击事件。

这是我为检测播放/暂停按钮的单击,完美工作的方法。

步骤1:创建自定义控制调度程序类,覆盖方法dispatchSetPlayWhenReady

class PlayerControlDispatcher : DefaultControlDispatcher() {
    override fun dispatchSetPlayWhenReady(player: Player?, playWhenReady: Boolean): Boolean {
        if(playWhenReady) {
           // Play button clicked
        } else {
          // Paused button clicked
        }
        return super.dispatchSetPlayWhenReady(player, playWhenReady)
    }
}

步骤2:将自定义控制调度器类PlayerControlDispatcher设置为播放器视图。

playerView.setControlDispatcher(PlayerControlDispatcher())

其中playerview是我们在布局文件中声明的com.google.android.exoplayer2.ui.PlayerView的实例。

kotlin 2020解决方案方法更新

据报道已注册的Player.EventListener实例等事件,例如状态和播放错误。

Player.EventListener 具有空默认方法,因此您只需要实现您感兴趣的方法。

首先您的课程,说您的活动,必须将符合到Player.EventListener接口。

然后,您在课堂上覆盖onIsPlayingChanged方法。外部onCreate方法...

将侦听器添加到您的播放器实例:

// Adding player listener for tracking events
player?.addListener(this)

您可以检查玩家是否在玩播放器(即位置正在前进)。播放:

//Listening to player events
override fun onIsPlayingChanged(isPlaying: Boolean){
    if (isPlaying) {
        // Active playback.
    } else {
        // Not playing because playback is paused, ended, suppressed, or the player
        // is buffering, stopped or failed. Check player.getPlaybackState,
        // player.getPlayWhenReady, player.getPlaybackError and
        // player.getPlaybackSuppressionReason for details.
    }
}

就是这样。非常简单。

您可以使用exoplayer.getPlayWhenReady()检查播放器当前处于暂停状态还是在播放状态。

我认为回调:

fun onPlayWhenReadyChanged(playWhenReady: Boolean, reason: Int)

来自Player.Listener

带有2.16.1版本,我使用此代码:

exoPlayer.addListener(object : Player.Listener {
    override fun onIsPlayingChanged(isPlaying: Boolean) {
        if (isPlaying){
            videoIsPlaying()
        }
    }
})

请尝试以下代码剪切。播放器侦听器(OnplayerStatechanged)不好观察播放/暂停操作,称为多个时间,并且在播放器配置时也调用。

videoView.setControlDispatcher(object : DefaultControlDispatcher() {
            override fun dispatchSetPlayWhenReady(player: Player, playWhenReady: Boolean): Boolean {
                if (playWhenReady)
                  // Tap on Play button  
                else
                 // Tap on Pause button
                return super.dispatchSetPlayWhenReady(player, playWhenReady)
            }
        })

kotlin

private fun ExoPlayer.isPlaying() =
    playbackState == Player.STATE_READY && playWhenReady

您必须使用新版本:com.google.android.exoplayer:exoplayer:2.18.6

此功能已弃用:

@Deprecated
    default void onPlayerStateChanged(boolean playWhenReady, @State int playbackState) {}

新功能是:

 default void onPlaybackStateChanged(@State int playbackState) {}

例如:

exoPlayer?.addListener(object : Player.Listener {
            override fun onPlaybackStateChanged(@Player.State state: Int) {
                when (state) {
                    Player.STATE_READY -> {
                        // The player is able to immediately play from its current position. The player will be playing if getPlayWhenReady() is true, and paused otherwise.
                    }
                    Player.STATE_BUFFERING -> {
                       // The player is not able to immediately play the media, but is doing work toward being able to do so. This state typically occurs when the player needs to buffer more data before playback can start.
                    }
                    Player.STATE_IDLE -> {
                       // The player is idle, meaning it holds only limited resources.The player must be prepared before it will play the media.
                    }
                    Player.STATE_ENDED -> { 
                       // The player has finished playing the media.
                    }
                    else -> {
                      // Other things
                    }
                }
            }
        })

最新更新