在活动的onPause()中,我将false传递给player.setPlayerWhenReady(),我按下手机的主页按钮,因此活动的onPause()被调用但我将应用程序保持在后台,我没有从堆栈中删除,大约20分钟后我重新打开应用程序,因此调用活动的 onStart() 再次初始化 exoplayer 并传递有效的视频 url,然后传递 player.setPlayerWhenReady(true),但 exo 播放器直接在其回调中调用 onPlayerError() .. 但是当我关闭堆栈中的应用程序并再次打开应用程序 exo 播放器工作正常...请帮助解决此问题。
代码是这样的。。
simpleExoPlayerView = (SimpleExoPlayerView) findViewById(R.id.player_view);
simpleExoPlayerView.requestFocus();
TrackSelection.Factory videoTrackSelectionFactory =
new AdaptiveTrackSelection.Factory(bandwidthMeter);
trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory);
player = ExoPlayerFactory.newSimpleInstance(this, trackSelector);
Log.d(AppConstants.LOG_TAG_LOG, "initializePlayer: player instance in initializePlayer is ="+player);
simpleExoPlayerView.setPlayer(player);
Log.d(AppConstants.LOG_TAG_LOG, "initializePlayer: shouldAutoPlay is ="+shouldAutoPlay);
player.setPlayWhenReady(true);
DefaultExtractorsFactory extractorsFactory = new DefaultExtractorsFactory();
MediaSource mediaSource = new ExtractorMediaSource(Uri.parse(url), mediaDataSourceFactory,
extractorsFactory, null, null);
durationSet = false;
player.prepare(mediaSource);
seekToValue = scSchedule.getSeekPosition();
if (seekToValue != null) {
player.seekTo(seekToValue);
} else {
player.seekTo(0);
seekToValue = 0L;
}
player.addListener(new Player.EventListener() {
@Override
public void onTimelineChanged(Timeline timeline, Object manifest) {
}
@Override
public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {
}
@Override
public void onLoadingChanged(boolean isLoading) {
}
@Override
public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
if (playbackState == ExoPlayer.STATE_ENDED) {
Log.d(AppConstants.LOG_TAG_LOG,
"In FullScreenVideoActivity::onPlayerStateChanged() ");
// increment videoViewCount in Analytics table
AppUtils.getInstance().updateAnalytics(false,
-1, true);
// update video watched duration in Analytics table
int videoViewDuration = 0;
if (seekToValue != null) {
if (filmDuration > seekToValue) {
videoViewDuration = (int) (filmDuration - seekToValue);
AppUtils.getInstance().updateAnalytics(false,
videoViewDuration / 1000,
false);
}
}
isVideoEnded = true;
videoEnded();
finish();
} else if (playbackState == ExoPlayer.STATE_READY && !durationSet) {
filmDuration = (int) player.getDuration();
Log.d(AppConstants.LOG_TAG_LOG,
"In FullScreenVideoActivity::onPlayerStateChanged(), " +
"filmDuration = " + filmDuration);
durationSet = true;
}
}
@Override
public void onRepeatModeChanged(int repeatMode) {
}
@Override
public void onPlayerError(ExoPlaybackException error) {
Log.d(AppConstants.LOG_TAG_LOG,"onPlayerError() called");
}
@Override
public void onPositionDiscontinuity() {
}
@Override
public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {
}
});
private void releasePlayer() {
if (player != null) {
shouldAutoPlay = player.getPlayWhenReady();
player.release();
player = null;
trackSelector = null;
}
}
我在活动的 onDestroy() 中调用此释放方法。