ExoPlayer stop/pause 不工作

ExoPlayer stop/pause not working

我在其中一个 activity 中添加了 ExoPlayer 来播放视频,它工作正常。但是当视频正在播放并且用户按下后退按钮时,视频仍会继续在后台播放。我想让它停止。我尝试捕获后退按钮并尝试暂停视频,但它不起作用。除非你杀死 activity,否则视频会一直播放直到结束。这是一个错误还是图书馆应该如何工作?

这是 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();
        }
    }

我在调试模式下查看代码并执行了这条语句,但仍然没有停止视频。

试试这个...

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

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

private void releasePlayer() {
        if (player != null) {
            updateResumePosition();
            player.removeListener(this);
            player.stop();
            player.release();
            player = null;
            trackSelector = null;
            trackSelectionHelper = null;
            eventLogger = null;
        }
    }

参见 ExoPlayer 演示中的 PlayerActivity class。

我建议在 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();
  }
}

我的代码适用于音频 activity:

public void release() {

    if (exoPlayer != null) {
        exoPlayer.removeListener(eventListener);
        exoPlayer.release();
        exoPlayer = null;
        dataSpec =null;
        assetDataSource = null;
        factory = null;
        audioSource =null;
    }
}

@Override
public void onBackPressed() {
    // TODO Auto-generated method stub
    super.onBackPressed();
    setPlayPause(false);
    release();

    finish();
}

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

以下代码对我来说工作正常:

    @Override 
    public void onPause() {
        super.onPause()
        exoPlayer.setPlayWhenReady(false);
    }

    @Override 
    public void onResume() {
        super.onResume()
        exoPlayer.setPlayWhenReady(true);
    }

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

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