Android Exoplayer сохранить состояние - PullRequest
0 голосов
/ 28 июня 2018

Привет! Я использую ExoPlayer для отображения видеоконтента в VideoActivity. Я использую три переменные для сохранения состояния, определенного в официальных документах: playPosition, currentWindow, playWhenReady Я показываю видео в полноэкранном режиме, когда устройство находится в альбомном режиме, поэтому у меня есть 2 макета, один для портретного режима и один для ландшафтного режима:

Это код моей VideoActivity, и я проверил, что значения правильно сохранены и правильно получены:

Видео начинается с запуска, когда я поворачиваю устройство, а не из сохраненного положения.

public class VideoActivity extends AppCompatActivity {

private SimpleExoPlayerView playerView;
private ExoPlayer player;

private int position;
private ArrayList<RecipeStep> steps;

private boolean playWhenReady;
private int currentWindow;
private long playbackPosition;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_video);

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    if(savedInstanceState == null){
        playWhenReady = true;
        currentWindow = 0;
        playbackPosition = 0;
    }else {
        playWhenReady = savedInstanceState.getBoolean("playWhenReady");
        currentWindow = savedInstanceState.getInt("currentWindow");
        playbackPosition = savedInstanceState.getLong("playBackPosition");
    }

    if(getIntent().getExtras() != null) {
        position = getIntent().getIntExtra("position", 0);
        steps = getIntent().getParcelableArrayListExtra("steps");
    }

    playerView = findViewById(R.id.video_view);

    if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT)
        setStepTexts(position);

}

private void setStepTexts(int pos){
    ((TextView) findViewById(R.id.step_short_description)).setText(steps.get(pos-1).getShort_description());
    ((TextView) findViewById(R.id.step_description)).setText(steps.get(pos-1).getDescription());
}

private void initializePayer(){
    player = ExoPlayerFactory.newSimpleInstance(
            new DefaultRenderersFactory(this),
            new DefaultTrackSelector(), new DefaultLoadControl());

    playerView.setPlayer(player);
    player.setPlayWhenReady(playWhenReady);
    player.seekTo(currentWindow, playbackPosition);

    passVideoUri(position);

}

private void passVideoUri(int pos){
    Uri uri = Uri.parse(steps.get(pos-1).getVideo_url());
    MediaSource mediaSource = buildMediaSource(uri);
    player.prepare(mediaSource, true, false);
}

private MediaSource buildMediaSource(Uri uri){
    return new ExtractorMediaSource.Factory(
            new DefaultHttpDataSourceFactory("exoplayer-codelab")).createMediaSource(uri);
}

@Override
protected void onStart() {
    super.onStart();
    initializePayer();
}

@Override
protected void onStop() {
    super.onStop();
    releasePlayer();
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    playbackPosition = player.getCurrentPosition();
    currentWindow = player.getCurrentWindowIndex();
    playWhenReady = player.getPlayWhenReady();

    outState.putBoolean("playWhenReady", playWhenReady);
    outState.putInt("currentWindow", currentWindow);
    outState.putLong("playBackPosition", playbackPosition);
    super.onSaveInstanceState(outState);
}

public void previous(View view){
    if(position > 1) {
        position--;
        setStepTexts(position);
        passVideoUri(position);
    }
}

public void next(View view){
    if(position < steps.size()) {
        position++;
        setStepTexts(position);
        passVideoUri(position);
    }
}

private void releasePlayer(){
    playbackPosition = player.getCurrentPosition();
    currentWindow = player.getCurrentWindowIndex();
    playWhenReady = player.getPlayWhenReady();
    player.release();
    player = null;
}
}

Пожалуйста, посмотрите и посмотрите, что я делаю неправильно.

1 Ответ

0 голосов
/ 28 июня 2018

Сначала вам нужно подготовить игрока, а затем вы можете искать в нужном месте. Таким образом, ваш код будет выглядеть как

passVideoUri(position); 
playerView.setPlayer(player); 
player.setPlayWhenReady(playWhenReady); 
player.seekTo(currentWindow, playbackPosition);
...