'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 |
