I am developing streaming application, so for that i am using exoplayer. This is the code.It is working everything fine.But I need to show notification along with title and play/pause button. This play/pause button must work like activity play/pause button and this play/pause button must change as per play/pause.
public class MainActivity extends AppCompatActivity {
private SimpleExoPlayer exoPlayer;
private ExoPlayer.EventListener eventListener = new ExoPlayer.EventListener() {
@Override
public void onTimelineChanged(Timeline timeline, Object manifest) {
Log.i(TAG,"onTimelineChanged");
}
@Override
public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {
Log.i(TAG,"onTracksChanged");
}
@Override
public void onLoadingChanged(boolean isLoading) {
Log.i(TAG,"onLoadingChanged");
}
@Override
public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
Log.i(TAG,"onPlayerStateChanged: playWhenReady = "+String.valueOf(playWhenReady)
+" playbackState = "+playbackState);
switch (playbackState){
case ExoPlayer.STATE_ENDED:
Log.i(TAG,"Playback ended!");
//Stop playback and return to start position
setPlayPause(false);
exoPlayer.seekTo(0);
break;
case ExoPlayer.STATE_READY:
Log.i(TAG,"ExoPlayer ready! pos: "+exoPlayer.getCurrentPosition()
+" max: "+stringForTime((int)exoPlayer.getDuration()));
setProgress();
break;
case ExoPlayer.STATE_BUFFERING:
Log.i(TAG,"Playback buffering!");
break;
case ExoPlayer.STATE_IDLE:
Log.i(TAG,"ExoPlayer idle!");
break;
}
}
@Override
public void onPlayerError(ExoPlaybackException error) {
Log.i(TAG,"onPlaybackError: "+error.getMessage());
}
@Override
public void onPositionDiscontinuity() {
Log.i(TAG,"onPositionDiscontinuity");
}
};
private SeekBar seekPlayerProgress;
private Handler handler;
private ImageButton btnPlay;
private TextView txtCurrentTime, txtEndTime;
private boolean isPlaying = false;
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
prepareExoPlayerFromURL(Uri.parse("https://firebasestorage.googleapis.com/v0/b/musyc-f264f.appspot.com/o/Karone-Okarone-Minar-Rahman-Official-Music-Video-Eagle-Music.mp3?alt=media&token=a40ed28a-2970-4160-ac1d-33881e34253a"));
}
private void prepareExoPlayerFromURL(Uri uri){
TrackSelector trackSelector = new DefaultTrackSelector();
LoadControl loadControl = new DefaultLoadControl();
exoPlayer = ExoPlayerFactory.newSimpleInstance(this, trackSelector, loadControl);
DefaultDataSourceFactory dataSourceFactory = new DefaultDataSourceFactory(this, Util.getUserAgent(this, "exoplayer2example"), null);
ExtractorsFactory extractorsFactory = new DefaultExtractorsFactory();
MediaSource audioSource = new ExtractorMediaSource(uri, dataSourceFactory, extractorsFactory, null, null);
exoPlayer.addListener(eventListener);
exoPlayer.prepare(audioSource);
initMediaControls();
}
private void initMediaControls() {
initPlayButton();
initSeekBar();
initTxtTime();
}
private void initPlayButton() {
btnPlay = (ImageButton) findViewById(R.id.btnPlay);
btnPlay.requestFocus();
btnPlay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
setPlayPause(!isPlaying);
}
});
}
/**
* Starts or stops playback. Also takes care of the Play/Pause button toggling
* @param play True if playback should be started
*/
private void setPlayPause(boolean play){
isPlaying = play;
exoPlayer.setPlayWhenReady(play);
if(!isPlaying){
btnPlay.setImageResource(android.R.drawable.ic_media_play);
}else{
setProgress();
btnPlay.setImageResource(android.R.drawable.ic_media_pause);
}
}
private void initTxtTime() {
txtCurrentTime = (TextView) findViewById(R.id.time_current);
txtEndTime = (TextView) findViewById(R.id.player_end_time);
}
private String stringForTime(int timeMs) {
StringBuilder mFormatBuilder;
Formatter mFormatter;
mFormatBuilder = new StringBuilder();
mFormatter = new Formatter(mFormatBuilder, Locale.getDefault());
int totalSeconds = timeMs / 1000;
int seconds = totalSeconds % 60;
int minutes = (totalSeconds / 60) % 60;
int hours = totalSeconds / 3600;
mFormatBuilder.setLength(0);
if (hours > 0) {
return mFormatter.format("%d:%02d:%02d", hours, minutes, seconds).toString();
} else {
return mFormatter.format("%02d:%02d", minutes, seconds).toString();
}
}
private void setProgress() {
seekPlayerProgress.setProgress(0);
seekPlayerProgress.setMax((int) exoPlayer.getDuration()/1000);
txtCurrentTime.setText(stringForTime((int)exoPlayer.getCurrentPosition()));
txtEndTime.setText(stringForTime((int)exoPlayer.getDuration()));
if(handler == null)handler = new Handler();
//Make sure you update Seekbar on UI thread
handler.post(new Runnable() {
@Override
public void run() {
if (exoPlayer != null && isPlaying) {
seekPlayerProgress.setMax((int) exoPlayer.getDuration()/1000);
int mCurrentPosition = (int) exoPlayer.getCurrentPosition() / 1000;
seekPlayerProgress.setProgress(mCurrentPosition);
txtCurrentTime.setText(stringForTime((int)exoPlayer.getCurrentPosition()));
txtEndTime.setText(stringForTime((int)exoPlayer.getDuration()));
handler.postDelayed(this, 1000);
}
}
});
}
private void initSeekBar() {
seekPlayerProgress = (SeekBar) findViewById(R.id.mediacontroller_progress);
seekPlayerProgress.requestFocus();
seekPlayerProgress.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (!fromUser) {
// We're not interested in programmatically generated changes to
// the progress bar's position.
return;
}
exoPlayer.seekTo(progress*1000);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
seekPlayerProgress.setMax(0);
seekPlayerProgress.setMax((int) exoPlayer.getDuration()/1000);
}
}
I have tried many ways. Music player control in notification
How to put media controller button on notification bar?
https://github.com/yalematta/ExoPlayback
but not working. So can any please help me how to do this, Thank you so much for your suggestion..
Basically, ExoPlayer
provides a way for developers to tell the system that "I want to show player on the notification area". That is PlayerNotificationManager
. Firstly, you need to add this declaration in the AndroidManifest.xml
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
And then, you can implement code as below:
private ExoPlayer exoPlayer;
private PlayerNotificationManager playerNotificationManager;
private int notificationId = 1234;
private PlayerNotificationManager.MediaDescriptionAdapter mediaDescriptionAdapter = new PlayerNotificationManager.MediaDescriptionAdapter() {
@Override
public String getCurrentSubText(Player player) {
return "Sub text";
}
@Override
public String getCurrentContentTitle(Player player) {
return "Title";
}
@Override
public PendingIntent createCurrentContentIntent(Player player) {
return null;
}
@Override
public String getCurrentContentText(Player player) {
return "ContentText";
}
@Override
public Bitmap getCurrentLargeIcon(Player player, PlayerNotificationManager.BitmapCallback callback) {
return null;
}
};
@Override
public void onCreate() {
super.onCreate();
BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
TrackSelection.Factory videoTrackSelectionFactory = new AdaptiveTrackSelection.Factory(bandwidthMeter);
TrackSelector trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory);
exoPlayer = ExoPlayerFactory.newSimpleInstance(this, trackSelector);
exoPlayer.setPlayWhenReady(true);
playerNotificationManager = PlayerNotificationManager.createWithNotificationChannel(this, "My_channel_id", R.string.channel_name, notificationId, mediaDescriptionAdapter, new PlayerNotificationManager.NotificationListener() {
@Override
public void onNotificationPosted(int notificationId, Notification notification, boolean ongoing) {
}
@Override
public void onNotificationCancelled(int notificationId, boolean dismissedByUser) {
}
});
playerNotificationManager.setPlayer(exoPlayer);
}
@Override
public void onDestroy() {
super.onDestroy();
if (playerNotificationManager != null) {
playerNotificationManager.setPlayer(null);
}
if (exoPlayer != null) {
exoPlayer.release();
exoPlayer = null;
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With