'Exoplayer keep playing in background while shuting down the app or activity

this is my code of main activity i am using test m3u8 link first video keep playing in background on closing app or closing activity 2nd by this code sample test link played well but live tv streaming m3u8 does not work.

package com.live.cricketmatches;

import androidx.appcompat.app.AppCompatActivity;


import android.content.pm.ActivityInfo;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.WindowManager;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.PopupMenu;
import android.widget.ProgressBar;
import android.widget.Toast;

import com.google.android.exoplayer2.DefaultLoadControl;
import com.google.android.exoplayer2.ExoPlayer;
import com.google.android.exoplayer2.LoadControl;
import com.google.android.exoplayer2.MediaItem;
import com.google.android.exoplayer2.PlaybackException;
import com.google.android.exoplayer2.PlaybackParameters;
import com.google.android.exoplayer2.Player;
import com.google.android.exoplayer2.SimpleExoPlayer;
import com.google.android.exoplayer2.Timeline;
import com.google.android.exoplayer2.source.DefaultMediaSourceFactory;
import com.google.android.exoplayer2.source.TrackGroupArray;
import com.google.android.exoplayer2.source.hls.HlsMediaSource;
import com.google.android.exoplayer2.trackselection.AdaptiveTrackSelection;
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
import com.google.android.exoplayer2.trackselection.TrackSelector;
import com.google.android.exoplayer2.ui.PlayerView;
import com.google.android.exoplayer2.ui.StyledPlayerControlView;
import com.google.android.exoplayer2.ui.StyledPlayerView;
import com.google.android.exoplayer2.upstream.BandwidthMeter;
import com.google.android.exoplayer2.upstream.DataSource;
import com.google.android.exoplayer2.upstream.DefaultBandwidthMeter;
import com.google.android.exoplayer2.upstream.DefaultHttpDataSource;

public class MainActivity5 extends AppCompatActivity {
ExoPlayer player;
ProgressBar progressBar;
ImageView btFullScreen;
ImageView btQuality;

boolean flag = false;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main5);
    PlayerView playerView = findViewById(R.id.video_view);
    progressBar= findViewById(R.id.exo_progress);
    btFullScreen= playerView.findViewById(R.id.exo_fullscreen_button);                                              

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);

    //Initialize Load Control
    LoadControl loadControl = new DefaultLoadControl();
    // Create a data source factory.
    DataSource.Factory dataSourceFactory = new DefaultHttpDataSource.Factory();

    MediaItem mediaItem = MediaItem.fromUri(
     "https://bitdash-a.akamaihd.net/content/sintel/hls/playlist.m3u8");
    player.setMediaItem(mediaItem);
    player = new ExoPlayer.Builder(this).build();

    playerView.setKeepScreenOn(true);
    playerView.setPlayer(player);

    player.prepare();
    player.setPlayWhenReady(true);


    btQuality.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            PopupMenu popup= new PopupMenu(MainActivity5.this,view);

            popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                @Override
                public boolean onMenuItemClick(MenuItem menuItem) {

           Toast.makeText(getApplicationContext(),"Clicked",Toast.LENGTH_LONG).show();

                    return false;
                }
            });


            Menu menu= popup.getMenu();
            menu.add(Menu.NONE,0,0,"Video quality");
            popup.show();




        }
    });
    btFullScreen.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (flag) {
                btFullScreen.setImageDrawable(getResources().getDrawable(R.drawable.ic_baseline_fullscreen_24));

                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

                flag = false;
            }
            else {

                btFullScreen.setImageDrawable(getResources().getDrawable(R.drawable.ic_baseline_fullscreen_24));

                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

                flag= true;

            }

        }
    });


    player.addListener(new Player.Listener() {
        public void onTimelineChanged(Timeline timeline, Object manifest, int reason) {

        }

        public void onTracksChanged(TrackGroupArray trackGroups, TrackGroupArray trackSelections) {

        }

        @Override
        public void onLoadingChanged(boolean isLoading) {

        }

        @Override
        public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {

            if(playbackState== Player.STATE_BUFFERING){

                progressBar.setVisibility(View.VISIBLE);

            }else if(playbackState==Player.STATE_READY){
                progressBar.setVisibility(View.GONE);


            }

        }

        @Override
        public void onRepeatModeChanged(int repeatMode) {

        }

        @Override
        public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) {

        }

        @Override
        public void onPlayerError(PlaybackException error) {

        }

        @Override
        public void onPositionDiscontinuity(int reason) {

        }

        @Override
        public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {

        }

        @Override
        public void onSeekProcessed() {

        }
    });



}

@Override
protected void onPause() {
    super.onPause();
    player.setPlayWhenReady(false);
    player.getPlaybackState();

}

@Override
protected void onRestart() {
    super.onRestart();
    player.setPlayWhenReady(true);
    player.getPlaybackState();

}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu_main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle item selection
    switch (item.getItemId()) {
        case R.id.action_add:
            return true;
        case R.id.action_settings:
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

}



Solution 1:[1]

You are only changing the playWhenReady flag when the app goes to the background. The playWhenReady flag tells the player to automatically play the media when it switches to Player.STATE_READY so we don't need to call player.play() explicitly.

You can stop the player in onPause like this:

override fun onPause() {
    super.onPause()
    player.stop()
}

And then when the activity is opened again:

override fun onStart() {
    super.onStart()
    player.prepare()
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Kalpesh Chandora