Detect pause/resume in ExoPlayer

╄→尐↘猪︶ㄣ 提交于 2019-12-05 09:47:15

问题


I searched two days for this question in github but i can't find true answer . I want example for detecting pause / resume in ExoPlayer > 2.x . Any one can give me an example ? I checked onPlayerStateChanged and problem not solved .

onPlayerStateChanged   :   STATE_BUFFERING 
onPlayerStateChanged   :   STATE_READY 

I just got this log from onPlayerStateChanged and this is not called in all times !


回答1:


You need to check playWhenReady with a Player.EventListener. The Playback states of ExoPlayer are independent from the player being paused or not:

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
    }
  }
});

To play/pause the player ExoPlayer provides

player.setPlayWhenReady(boolean)

The sequence of playback states with ExoPlayer with a media file which never stalls to rebuffer is once in each of the four states and does not express play/paused:

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

Each time the player needs to buffer it goes:

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

Setting playWhenReady does not affect the state.

All together your media is actually playing when

playWhenReady && playbackState == Player.STATE_READY

It plays when ready. :)




回答2:


You can use this function:

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



回答3:


You can use exoplayer.getPlayWhenReady() to check whether the player is currently in a pause state or playing state.




回答4:


I had the same requirement to detect the click event of exoplayer play/pause button. Above answers were mainly talking about the state not about the button click event.

This is what I did to detect the Play/Pause button click, works perfect.

Step 1: Create custom control dispatcher class and override the method 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)
    }
}

Step 2: Set the custom control dispatcher class PlayerControlDispatcher into the the player view.

playerView.setControlDispatcher(PlayerControlDispatcher())

Where playerView is an instance of com.google.android.exoplayer2.ui.PlayerView which we declare in our layout file.




回答5:


It must be that since the other answers were posted, a new method has been provided in Player.EventListener. This works well for me:

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

If isPlaying is false, it is paused, otherwise playing.



来源:https://stackoverflow.com/questions/47731779/detect-pause-resume-in-exoplayer

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!