Exoplayer 无法调用 seekTo()
Exoplayer can not call seekTo()
我正在尝试将 Exoplayer 设置为 Fragment,我在 initializePlayer(String mediaUri)
中传递了视频 url
视频效果很好,但如果我旋转设备,视频会重新启动,我阅读了几个教程来解决这个问题,但没有成功调用 seekTo()
对不起我的英语
public RecipeStepsVideoPlayerFragment() {
// Required empty public constructor
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view= inflater.inflate(R.layout.fragment_recipe_steps_video_player, container, false);
ButterKnife.bind(this, view);
Bundle bundle=getArguments();
if(bundle!=null){
videoUrl=bundle.getString(VIDEO_URL_KEY);
}
initializePlayer(videoUrl);
stepDescription.setText(bundle.getString(STEP_DESCRIPTION_KEY));
return view;
}
@Override
public void onViewStateRestored(@Nullable Bundle savedInstanceState) {
super.onViewStateRestored(savedInstanceState);
if (savedInstanceState != null) {
startAutoPlay = savedInstanceState.getBoolean(KEY_AUTO_PLAY);
startWindow = savedInstanceState.getInt(KEY_WINDOW);
startPosition = savedInstanceState.getLong(KEY_POSITION);
Toast.makeText(getContext(),startPosition.toString(), Toast.LENGTH_LONG).show();
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
releasePlayer();
outState.putBoolean(KEY_AUTO_PLAY, startAutoPlay);
outState.putInt(KEY_WINDOW, startWindow);
outState.putLong(KEY_POSITION, startPosition);
}
public void initializePlayer(String mediaUri) {
if (mExoPlayer == null) {
BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
TrackSelection.Factory videoTrackSelectionFactory =
new AdaptiveTrackSelection.Factory(bandwidthMeter);
trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory);
mExoPlayer = ExoPlayerFactory.newSimpleInstance(getContext(), trackSelector);
mPlayerView.setPlayer(mExoPlayer);
mediaDataSourceFactory = new DefaultDataSourceFactory(getContext(),
Util.getUserAgent(getContext(), "BakingX"),
(TransferListener<? super DataSource>) bandwidthMeter);
mediaSource = new ExtractorMediaSource
.Factory(mediaDataSourceFactory)
.createMediaSource(Uri.parse(mediaUri));
//my prolem I can not call seekTo
if (startPosition!=null) {
mExoPlayer.seekTo(startWindow,startPosition);
}
mExoPlayer.prepare(mediaSource);
mExoPlayer.setPlayWhenReady(playWhenReady);
}
}
private void releasePlayer() {
if (mExoPlayer!= null) {
startPosition = mExoPlayer.getCurrentPosition();
startWindow = mExoPlayer.getCurrentWindowIndex();
playWhenReady = mExoPlayer.getPlayWhenReady();
mExoPlayer.release();
mExoPlayer = null;
}
}
private void updateStartPosition() {
if (mExoPlayer != null) {
startAutoPlay = mExoPlayer.getPlayWhenReady();
startWindow = mExoPlayer.getCurrentWindowIndex();
startPosition = Math.max(0, mExoPlayer.getContentPosition());
}
}
@Override
public void onStart() {
super.onStart();
if (Util.SDK_INT > 23) {
initializePlayer(videoUrl);
}
}
@Override
public void onResume() {
super.onResume();
if (Util.SDK_INT <= 23 || mExoPlayer == null) {
initializePlayer(videoUrl);
}
}
@Override
public void onPause() {
super.onPause();
updateStartPosition();
if (Util.SDK_INT <= 23) {
releasePlayer();
}
}
@Override
public void onStop() {
super.onStop();
// releasePlayer();
if (Util.SDK_INT > 23) {
releasePlayer();
}
}
@Override
public void onDestroy() {
super.onDestroy();
releasePlayer();
}
}
我的问题是我在移动旋转后如何调用 seekTo()
几个问题:
1. 删除 playWhenReady
并将其更新为 startAutoPlay
。
2. 将代码从 onViewRestored
移动到 onCreateView
。
3.设置媒体源后更新位置
public RecipeStepsVideoPlayerFragment() {
// Required empty public constructor
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_recipe_steps_video_player, container, false);
ButterKnife.bind(this, view);
Bundle bundle = getArguments();
if (bundle != null) {
videoUrl = bundle.getString(VIDEO_URL_KEY);
}
if (savedInstanceState != null) {
startAutoPlay = savedInstanceState.getBoolean(KEY_AUTO_PLAY);
startWindow = savedInstanceState.getInt(KEY_WINDOW);
startPosition = savedInstanceState.getLong(KEY_POSITION);
Toast.makeText(getContext(), startPosition.toString(), Toast.LENGTH_LONG).show();
}
initializePlayer(videoUrl);
stepDescription.setText(bundle.getString(STEP_DESCRIPTION_KEY));
return view;
}
@Override
public void onViewStateRestored(@Nullable Bundle savedInstanceState) {
super.onViewStateRestored(savedInstanceState);
}
@Override
public void onSaveInstanceState(Bundle outState) {
releasePlayer();
outState.putBoolean(KEY_AUTO_PLAY, startAutoPlay);
outState.putInt(KEY_WINDOW, startWindow);
outState.putLong(KEY_POSITION, startPosition);
}
public void initializePlayer(String mediaUri) {
if (mExoPlayer == null) {
BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
TrackSelection.Factory videoTrackSelectionFactory =
new AdaptiveTrackSelection.Factory(bandwidthMeter);
trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory);
mExoPlayer = ExoPlayerFactory.newSimpleInstance(getContext(), trackSelector);
mPlayerView.setPlayer(mExoPlayer);
mediaDataSourceFactory = new DefaultDataSourceFactory(getContext(),
Util.getUserAgent(getContext(), "BakingX"),
(TransferListener<? super DataSource>) bandwidthMeter);
mediaSource = new ExtractorMediaSource
.Factory(mediaDataSourceFactory)
.createMediaSource(Uri.parse(mediaUri));
mExoPlayer.prepare(mediaSource);
if (startPosition != null) {
mExoPlayer.seekTo(startWindow, startPosition);
}
mExoPlayer.setPlayWhenReady(startAutoPlay);
}
}
private void releasePlayer() {
if (mExoPlayer != null) {
startPosition = mExoPlayer.getCurrentPosition();
startWindow = mExoPlayer.getCurrentWindowIndex();
startAutoPlay = mExoPlayer.getPlayWhenReady();
mExoPlayer.release();
mExoPlayer = null;
}
}
private void updateStartPosition() {
if (mExoPlayer != null) {
startAutoPlay = mExoPlayer.getPlayWhenReady();
startWindow = mExoPlayer.getCurrentWindowIndex();
startPosition = Math.max(0, mExoPlayer.getContentPosition());
}
}
@Override
public void onStart() {
super.onStart();
if (Util.SDK_INT > 23) {
initializePlayer(videoUrl);
}
}
@Override
public void onResume() {
super.onResume();
if (Util.SDK_INT <= 23 || mExoPlayer == null) {
initializePlayer(videoUrl);
}
}
@Override
public void onPause() {
super.onPause();
updateStartPosition();
if (Util.SDK_INT <= 23) {
releasePlayer();
}
}
@Override
public void onStop() {
super.onStop();
// releasePlayer();
if (Util.SDK_INT > 23) {
releasePlayer();
}
}
@Override
public void onDestroy() {
super.onDestroy();
releasePlayer();
}
我正在尝试将 Exoplayer 设置为 Fragment,我在 initializePlayer(String mediaUri)
中传递了视频 url
视频效果很好,但如果我旋转设备,视频会重新启动,我阅读了几个教程来解决这个问题,但没有成功调用 seekTo()
对不起我的英语
public RecipeStepsVideoPlayerFragment() {
// Required empty public constructor
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view= inflater.inflate(R.layout.fragment_recipe_steps_video_player, container, false);
ButterKnife.bind(this, view);
Bundle bundle=getArguments();
if(bundle!=null){
videoUrl=bundle.getString(VIDEO_URL_KEY);
}
initializePlayer(videoUrl);
stepDescription.setText(bundle.getString(STEP_DESCRIPTION_KEY));
return view;
}
@Override
public void onViewStateRestored(@Nullable Bundle savedInstanceState) {
super.onViewStateRestored(savedInstanceState);
if (savedInstanceState != null) {
startAutoPlay = savedInstanceState.getBoolean(KEY_AUTO_PLAY);
startWindow = savedInstanceState.getInt(KEY_WINDOW);
startPosition = savedInstanceState.getLong(KEY_POSITION);
Toast.makeText(getContext(),startPosition.toString(), Toast.LENGTH_LONG).show();
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
releasePlayer();
outState.putBoolean(KEY_AUTO_PLAY, startAutoPlay);
outState.putInt(KEY_WINDOW, startWindow);
outState.putLong(KEY_POSITION, startPosition);
}
public void initializePlayer(String mediaUri) {
if (mExoPlayer == null) {
BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
TrackSelection.Factory videoTrackSelectionFactory =
new AdaptiveTrackSelection.Factory(bandwidthMeter);
trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory);
mExoPlayer = ExoPlayerFactory.newSimpleInstance(getContext(), trackSelector);
mPlayerView.setPlayer(mExoPlayer);
mediaDataSourceFactory = new DefaultDataSourceFactory(getContext(),
Util.getUserAgent(getContext(), "BakingX"),
(TransferListener<? super DataSource>) bandwidthMeter);
mediaSource = new ExtractorMediaSource
.Factory(mediaDataSourceFactory)
.createMediaSource(Uri.parse(mediaUri));
//my prolem I can not call seekTo
if (startPosition!=null) {
mExoPlayer.seekTo(startWindow,startPosition);
}
mExoPlayer.prepare(mediaSource);
mExoPlayer.setPlayWhenReady(playWhenReady);
}
}
private void releasePlayer() {
if (mExoPlayer!= null) {
startPosition = mExoPlayer.getCurrentPosition();
startWindow = mExoPlayer.getCurrentWindowIndex();
playWhenReady = mExoPlayer.getPlayWhenReady();
mExoPlayer.release();
mExoPlayer = null;
}
}
private void updateStartPosition() {
if (mExoPlayer != null) {
startAutoPlay = mExoPlayer.getPlayWhenReady();
startWindow = mExoPlayer.getCurrentWindowIndex();
startPosition = Math.max(0, mExoPlayer.getContentPosition());
}
}
@Override
public void onStart() {
super.onStart();
if (Util.SDK_INT > 23) {
initializePlayer(videoUrl);
}
}
@Override
public void onResume() {
super.onResume();
if (Util.SDK_INT <= 23 || mExoPlayer == null) {
initializePlayer(videoUrl);
}
}
@Override
public void onPause() {
super.onPause();
updateStartPosition();
if (Util.SDK_INT <= 23) {
releasePlayer();
}
}
@Override
public void onStop() {
super.onStop();
// releasePlayer();
if (Util.SDK_INT > 23) {
releasePlayer();
}
}
@Override
public void onDestroy() {
super.onDestroy();
releasePlayer();
}
}
我的问题是我在移动旋转后如何调用 seekTo()
几个问题:
1. 删除 playWhenReady
并将其更新为 startAutoPlay
。
2. 将代码从 onViewRestored
移动到 onCreateView
。
3.设置媒体源后更新位置
public RecipeStepsVideoPlayerFragment() {
// Required empty public constructor
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_recipe_steps_video_player, container, false);
ButterKnife.bind(this, view);
Bundle bundle = getArguments();
if (bundle != null) {
videoUrl = bundle.getString(VIDEO_URL_KEY);
}
if (savedInstanceState != null) {
startAutoPlay = savedInstanceState.getBoolean(KEY_AUTO_PLAY);
startWindow = savedInstanceState.getInt(KEY_WINDOW);
startPosition = savedInstanceState.getLong(KEY_POSITION);
Toast.makeText(getContext(), startPosition.toString(), Toast.LENGTH_LONG).show();
}
initializePlayer(videoUrl);
stepDescription.setText(bundle.getString(STEP_DESCRIPTION_KEY));
return view;
}
@Override
public void onViewStateRestored(@Nullable Bundle savedInstanceState) {
super.onViewStateRestored(savedInstanceState);
}
@Override
public void onSaveInstanceState(Bundle outState) {
releasePlayer();
outState.putBoolean(KEY_AUTO_PLAY, startAutoPlay);
outState.putInt(KEY_WINDOW, startWindow);
outState.putLong(KEY_POSITION, startPosition);
}
public void initializePlayer(String mediaUri) {
if (mExoPlayer == null) {
BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
TrackSelection.Factory videoTrackSelectionFactory =
new AdaptiveTrackSelection.Factory(bandwidthMeter);
trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory);
mExoPlayer = ExoPlayerFactory.newSimpleInstance(getContext(), trackSelector);
mPlayerView.setPlayer(mExoPlayer);
mediaDataSourceFactory = new DefaultDataSourceFactory(getContext(),
Util.getUserAgent(getContext(), "BakingX"),
(TransferListener<? super DataSource>) bandwidthMeter);
mediaSource = new ExtractorMediaSource
.Factory(mediaDataSourceFactory)
.createMediaSource(Uri.parse(mediaUri));
mExoPlayer.prepare(mediaSource);
if (startPosition != null) {
mExoPlayer.seekTo(startWindow, startPosition);
}
mExoPlayer.setPlayWhenReady(startAutoPlay);
}
}
private void releasePlayer() {
if (mExoPlayer != null) {
startPosition = mExoPlayer.getCurrentPosition();
startWindow = mExoPlayer.getCurrentWindowIndex();
startAutoPlay = mExoPlayer.getPlayWhenReady();
mExoPlayer.release();
mExoPlayer = null;
}
}
private void updateStartPosition() {
if (mExoPlayer != null) {
startAutoPlay = mExoPlayer.getPlayWhenReady();
startWindow = mExoPlayer.getCurrentWindowIndex();
startPosition = Math.max(0, mExoPlayer.getContentPosition());
}
}
@Override
public void onStart() {
super.onStart();
if (Util.SDK_INT > 23) {
initializePlayer(videoUrl);
}
}
@Override
public void onResume() {
super.onResume();
if (Util.SDK_INT <= 23 || mExoPlayer == null) {
initializePlayer(videoUrl);
}
}
@Override
public void onPause() {
super.onPause();
updateStartPosition();
if (Util.SDK_INT <= 23) {
releasePlayer();
}
}
@Override
public void onStop() {
super.onStop();
// releasePlayer();
if (Util.SDK_INT > 23) {
releasePlayer();
}
}
@Override
public void onDestroy() {
super.onDestroy();
releasePlayer();
}