ExoPlayer停止/暂停无法正常工作

时间:2018-01-29 17:08:13

标签: android video exoplayer

我在其中一个活动中添加了ExoPlayer来播放视频并且它正常运行。但是当播放视频并且用户按下后退按钮时,视频仍然继续在后台播放。我希望它被停止。我尝试捕获后退按钮并尝试暂停视频,但它无法正常工作。除非您杀死该活动,否则视频会一直播放直至完成。这是一个错误,或者这是图书馆的工作方式吗?

这是expPlayr的工作代码

    String url = getIntent().getStringExtra("videoURL");
    String title = getIntent().getStringExtra("title");
    exoPlayerView = (SimpleExoPlayerView) findViewById(R.id.exo_player_id);

    BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();

    TrackSelector trackSelector = new DefaultTrackSelector(new AdaptiveTrackSelection.Factory(bandwidthMeter));

    exoPlayer = ExoPlayerFactory.newSimpleInstance(this, trackSelector);

    DefaultHttpDataSourceFactory dataSourceFactory = new DefaultHttpDataSourceFactory(title);
    ExtractorsFactory extractorsFactory = new DefaultExtractorsFactory();
    MediaSource m = new HlsMediaSource(Uri.parse(url), dataSourceFactory, null,null);

    exoPlayerView.setPlayer(exoPlayer);
    exoPlayer.prepare(m);
    exoPlayer.setPlayWhenReady(true);

以下是我试图用来停止视频的代码。

@Override
    public void onBackPressed(){
        try{
            exoPlayer.stop();

        }catch(Exception e){
            e.printStackTrace();
        }
    }

我在调试模式下查看代码并执行此语句,但仍未停止视频。

7 个答案:

答案 0 :(得分:2)

试试这个......

if (exoPlayer != null) {
    exoPlayer.setPlayWhenReady(false);
    exoPlayer.stop();
    exoPlayer.seekTo(0);
}

答案 1 :(得分:1)

我建议在Activity的生命周期方法中初始化并释放播放器。如果你正确地执行此操作,则不需要onBackPressed方法,因为您的代码是在生命周期方法中执行的。

PlayerActivity of the ExoPlayer demo application on Github基本上具有以下生命周期方法:

@Override
public void onStart() {
  super.onStart();
  if (Util.SDK_INT > 23) {
    initializePlayer();
  }
}

@Override
public void onResume() {
  super.onResume();
  if (Util.SDK_INT <= 23 || player == null) {
    initializePlayer();
  }
}

@Override
public void onPause() {
  super.onPause();
  if (Util.SDK_INT <= 23) {
    releasePlayer();
  }
}

@Override
public void onStop() {
  super.onStop();
  if (Util.SDK_INT > 23) {
    releasePlayer();
  }
}

答案 2 :(得分:0)

您可以使用exoplayer,releasePlayer方法的示例:

componentDidMount(){
   setTimeout( setInterval( () => this.minusOne(), 1000), 1000);
};

请参阅ExoPlayer演示中的PlayerActivity课程。

答案 3 :(得分:0)

我的代码正在进行音频活动:

import React, { Component } from 'react'
import Menu from './menu/view'
import Props from 'prop-types'
import { Container } from 'native-base'
import { updateAlertModalIsOpen } from './formControls/alertModal/action'
import AlertModalComponent from './formControls/alertModal/view'
import UserLoginModal from './user/login/loginModal/view'

import NavigationService from './navigationService'

class Vepo extends Component {
  componentDidMount() {
    const { store } = this.context
    this.unsubscribe = store.subscribe(() => {})
    store.dispatch(this.props.fetchUserGeoCoords())
    store.dispatch(this.props.fetchSearchQueryPageCategories())
    store.dispatch(this.props.fetchCategories())
  }

  componentWillUnmount() {
    this.unsubscribe()
  }

  render(): Object {
    return (
      <Container>
        <Menu
          store={this.context}
          ref={navigatorRef => {
            NavigationService.setTopLevelNavigator(navigatorRef)
          }}>
          <AlertModalComponent
            yesClicked={() => {
              updateAlertModalIsOpen(false)
            }}
          />
        </Menu>
        <UserLoginModal />
      </Container>
    )
  }
}
Vepo.contextTypes = {
  store: Props.object
}

export default Vepo

答案 4 :(得分:0)

我在项目中也遇到了同样的问题。我遇到的问题是-加载屏幕时,Exoplayer初始化了两次,并根据SDK版本在onPause或onResume()中调用realeseExoplayer()时释放了一个实例。即使关闭活动,第二个实例仍在后台继续播放。因此,请仔细检查Exoplayer是否已初始化两次。如果多次初始化,请进行必要的更改以初始化一次。

答案 5 :(得分:0)

以下代码对我来说很好:

O(n)

答案 6 :(得分:0)

这是一个示例,您可以如何实现Naveen Dew所说的话。

@Override
public void onDestroyView() {
    super.onDestroyView();
    if (exoPlayer != null) {
        exoPlayer.setPlayWhenReady(false);
        exoPlayer.stop();
        exoPlayer.seekTo(0);
    }
}