Как остановить воспроизведение звука в фоновом режиме в exoplayer

**

Необходимо реализовать видеопоток внутри фрагмента, используя exoplayer. Потоковая передача работает нормально, но при перемещении из действия фрагмента в другое действие или при повороте экрана несколько копий одного и того же аудио непрерывно воспроизводятся в фоновом режиме до тех пор, пока приложение не будет закрыто. Как это сделать, помогите. Заранее спасибо.

**

    public class VideoFragment extends Fragment {
    private SimpleExoPlayerView simpleExoPlayerView;
    public SimpleExoPlayer player;
    Uri mp4VideoUri;
    String TAG ="LOGG";
    SharedPrefs sharedPrefs;
    TextView notavailable;
    String url;
    Connection connection;
    long media_length;

    public VideoFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.video_fragment,container,false);
        sharedPrefs = new SharedPrefs(getContext());
        connection = new Connection(getContext());
        notavailable= (TextView) rootView.findViewById(R.id.videonotavailable);
        BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
        TrackSelection.Factory videoTrackSelectionFactory = new AdaptiveTrackSelection.Factory(bandwidthMeter);
        TrackSelector trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory);
        LoadControl loadControl = new DefaultLoadControl();
        player = ExoPlayerFactory.newSimpleInstance(getContext(), trackSelector, loadControl);
        simpleExoPlayerView = new SimpleExoPlayerView(getContext());
        simpleExoPlayerView = (SimpleExoPlayerView) rootView.findViewById(R.id.player_view);
        simpleExoPlayerView.setUseController(true);
        simpleExoPlayerView.requestFocus();
        simpleExoPlayerView.setPlayer(player);
        DefaultBandwidthMeter bandwidthMeterA = new DefaultBandwidthMeter();
        DefaultDataSourceFactory dataSourceFactory = new DefaultDataSourceFactory(getContext(), Util.getUserAgent(getContext(), "exoplayer2example"), bandwidthMeterA);
        ExtractorsFactory extractorsFactory = new DefaultExtractorsFactory();
        url=sharedPrefs.getvideoUrl();
        if (url==null || url.equals("")){
            simpleExoPlayerView.setVisibility(View.GONE);
            notavailable.setVisibility(View.VISIBLE);
        }else if (connection.isInternet()){
            mp4VideoUri=Uri.parse(sharedPrefs.getvideoUrl());
            MediaSource videoSource = new ExtractorMediaSource(mp4VideoUri,dataSourceFactory,extractorsFactory,null,null);
            final LoopingMediaSource loopingSource = new LoopingMediaSource(videoSource);

            player.prepare(loopingSource);

            player.addListener(new ExoPlayer.EventListener() {
                @Override
                public void onLoadingChanged(boolean isLoading) {
                    Log.v(TAG,"Listener-onLoadingChanged...");
                }

                @Override
                public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
                    Log.v(TAG,"Listener-onPlayerStateChanged...");
                }

                @Override
                public void onTimelineChanged(Timeline timeline, Object manifest) {
                    Log.v(TAG,"Listener-onTimelineChanged...");

                }

                @Override
                public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {

                }

                @Override
                public void onPlayerError(ExoPlaybackException error) {
                    Log.v(TAG,"Listener-onPlayerError...");
                    player.stop();
                }

                @Override
                public void onPositionDiscontinuity() {
                    Log.v("LOG","Listener-onPositionDiscontinuity...");

                }

                @Override
                public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {

                }
            });
            player.setPlayWhenReady(true);
        }else {
            simpleExoPlayerView.setVisibility(View.GONE);
            notavailable.setVisibility(View.VISIBLE);
            notavailable.setText(getString(R.string.nointernet));
        }
        return rootView;
    }

    @Override
    public void onPause() {
        super.onPause();
        if(player != null) {
            player.stop();
            player.release();
            media_length = player.getCurrentPosition();
        }
    }

    @Override
    public void onResume() {
        super.onResume();
        if(player != null) {
            player.seekTo(media_length);
            player.setPlayWhenReady(true);
        }
    }
}

1 ответ

В своей деятельности по хранению фрагментов вам нужно справиться с ситуацией в onPause метод:

@Override
protected void onPause() {
    super.onPause();
    mPlayerFragment.pause();
}

Вы можете определить метод в своем фрагменте, чтобы приостановить воспроизведение, передав false в setPlayWhenReady(),

public void pausePlayback() {
        mExoPlayer.setPlayWhenReady(false); //pauses the playback if it's playing
    }

Я столкнулся с той же проблемой, и проблема решена после реализации приведенного ниже кода в моем существующем коде.

Сначала вам нужно создать глобальную переменную

 boolean isActivityRunning = false;

Установите это значение в onCreate()и onResume() активности в true.

Вам нужно установить Player, если значение isActivityRunningэто верно

После этого нужно отпустить плеер и установить isActivityRunning = false в onPause(), onStop() а также onDestroy() это похоже

 @Override
    public void onPause() {
        super.onPause();
        isActivityRunning = false;
        releasePlayer();
    }

    @Override
    public void onStop() {
        super.onStop();
        isActivityRunning = false;
        releasePlayer();
    }

 @Override
    public void onBackPressed() {
        super.onBackPressed();
        releasePlayer();
    }

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

а также releasePlayer() реализация выглядит так

 SimpleExoPlayer player;
 PlayerView playerUI;

     private void releasePlayer(){
            if(player!=null){
                player.release();
                player.clearVideoSurface();
                playerUI.getPlayer().release();;
    
    
                player = null;
                playerUI =null;
            }
        }

Где player и player UI - это глобальная переменная, которой необходимо установить null

Это решение мне подходит.

Другие вопросы по тегам