ExoPlayer and start / pause / seekTo commands ExoPlayer and start / pause / seekTo commands android android

ExoPlayer and start / pause / seekTo commands


The official example of the PlayerControl in the ExoPlayer source code do exactly what you asked:

public class PlayerControl implements MediaPlayerControl {  private final ExoPlayer exoPlayer;  public PlayerControl(ExoPlayer exoPlayer) {    this.exoPlayer = exoPlayer;  }  @Override  public boolean canPause() {    return true;  }  @Override  public boolean canSeekBackward() {    return true;  }  @Override  public boolean canSeekForward() {    return true;  }  @Override  public int getAudioSessionId() {    throw new UnsupportedOperationException();  }  @Override  public int getBufferPercentage() {    return exoPlayer.getBufferedPercentage();  }  @Override  public int getCurrentPosition() {    return exoPlayer.getDuration() == ExoPlayer.UNKNOWN_TIME ? 0        : (int) exoPlayer.getCurrentPosition();  }  @Override  public int getDuration() {    return exoPlayer.getDuration() == ExoPlayer.UNKNOWN_TIME ? 0        : (int) exoPlayer.getDuration();  }  @Override  public boolean isPlaying() {    return exoPlayer.getPlayWhenReady();  }  @Override  public void start() {    exoPlayer.setPlayWhenReady(true);  }  @Override  public void pause() {    exoPlayer.setPlayWhenReady(false);  }  @Override  public void seekTo(int timeMillis) {    long seekPosition = exoPlayer.getDuration() == ExoPlayer.UNKNOWN_TIME ? 0        : Math.min(Math.max(0, timeMillis), getDuration());    exoPlayer.seekTo(seekPosition);  }}

If you are experiencing strange behaviors during the seek operation, it may be due to you particular stream/file type. I can suggest you to take a look at the base implementation of the ExoPlayer and, eventually, report any issue on Github.


Here's how the example code does it for Exoplayer 2:

player.setPlayWhenReady(true);

starts playback, (false stops)

If the player is already in the ready state then this method can be used to pause and resume playback.

To seek, they use

boolean haveStartPosition = startWindow != C.INDEX_UNSET;if (haveStartPosition) {  player.seekTo(startWindow, startPosition);}player.prepare(mediaSource, !haveStartPosition, false);

So it seems you need to prepare after the seekTo.