Music Basic
Download MaterialX 2.8
Get the Full Android Source Code for all the listed Layouts and more.
Buy Now for $25Layout Screenshot

package com.material.components.activity.player;
import android.content.res.AssetFileDescriptor;
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Handler;
import com.google.android.material.snackbar.Snackbar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.AppCompatSeekBar;
import androidx.appcompat.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageButton;
import android.widget.SeekBar;
import com.material.components.R;
import com.material.components.utils.MusicUtils;
import com.material.components.utils.Tools;
public class PlayerMusicBasic extends AppCompatActivity {
private View parent_view;
private AppCompatSeekBar seek_song_progressbar;
private ImageButton bt_play;
// Media Player
private MediaPlayer mp;
// Handler to update UI timer, progress bar etc,.
private Handler mHandler = new Handler();
//private SongsManager songManager;
private MusicUtils utils;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_player_music_basic);
initToolbar();
initComponent();
}
private void initToolbar() {
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setNavigationIcon(R.drawable.ic_menu);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
Tools.setSystemBarColor(this, R.color.grey_1000);
}
private void initComponent() {
parent_view = findViewById(R.id.parent_view);
seek_song_progressbar = (AppCompatSeekBar) findViewById(R.id.seek_song_progressbar);
bt_play = (ImageButton) findViewById(R.id.bt_play);
// set Progress bar values
seek_song_progressbar.setProgress(0);
seek_song_progressbar.setMax(MusicUtils.MAX_PROGRESS);
// Media Player
mp = new MediaPlayer();
mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
// Changing button image to play button
bt_play.setImageResource(R.drawable.ic_play_arrow);
}
});
try {
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
AssetFileDescriptor afd = getAssets().openFd("short_music.mp3");
mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
afd.close();
mp.prepare();
} catch (Exception e) {
Snackbar.make(parent_view, "Cannot load audio file", Snackbar.LENGTH_SHORT).show();
}
utils = new MusicUtils();
// Listeners
seek_song_progressbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// remove message Handler from updating progress bar
mHandler.removeCallbacks(mUpdateTimeTask);
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
mHandler.removeCallbacks(mUpdateTimeTask);
int totalDuration = mp.getDuration();
int currentPosition = utils.progressToTimer(seekBar.getProgress(), totalDuration);
// forward or backward to certain seconds
mp.seekTo(currentPosition);
// update timer progress again
mHandler.post(mUpdateTimeTask);
}
});
buttonPlayerAction();
}
/**
* Play button click event plays a song and changes button to pause image
* pauses a song and changes button to play image
*/
private void buttonPlayerAction() {
bt_play.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// check for already playing
if (mp.isPlaying()) {
mp.pause();
// Changing button image to play button
bt_play.setImageResource(R.drawable.ic_play_arrow);
} else {
// Resume song
mp.start();
// Changing button image to pause button
bt_play.setImageResource(R.drawable.ic_pause);
// Updating progress bar
mHandler.post(mUpdateTimeTask);
}
}
});
}
public void controlClick(View v) {
int id = v.getId();
switch (id) {
case R.id.bt_repeat: {
toggleButtonColor((ImageButton) v);
Snackbar.make(parent_view, "Repeat", Snackbar.LENGTH_SHORT).show();
break;
}
case R.id.bt_shuffle: {
toggleButtonColor((ImageButton) v);
Snackbar.make(parent_view, "Shuffle", Snackbar.LENGTH_SHORT).show();
break;
}
case R.id.bt_prev: {
toggleButtonColor((ImageButton) v);
Snackbar.make(parent_view, "Previous", Snackbar.LENGTH_SHORT).show();
break;
}
case R.id.bt_next: {
toggleButtonColor((ImageButton) v);
Snackbar.make(parent_view, "Next", Snackbar.LENGTH_SHORT).show();
break;
}
}
}
private boolean toggleButtonColor(ImageButton bt) {
String selected = (String) bt.getTag(bt.getId());
if (selected != null) { // selected
bt.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_ATOP);
bt.setTag(bt.getId(), null);
return false;
} else {
bt.setTag(bt.getId(), "selected");
bt.setColorFilter(getResources().getColor(R.color.red_500), PorterDuff.Mode.SRC_ATOP);
return true;
}
}
/**
* Background Runnable thread
*/
private Runnable mUpdateTimeTask = new Runnable() {
public void run() {
long totalDuration = mp.getDuration();
long currentDuration = mp.getCurrentPosition();
// Updating progress bar
int progress = (int) (utils.getProgressSeekBar(currentDuration, totalDuration));
seek_song_progressbar.setProgress(progress);
// Running this thread after 10 milliseconds
if (mp.isPlaying()) {
mHandler.postDelayed(this, 100);
}
}
};
// stop player when destroy
@Override
public void onDestroy() {
super.onDestroy();
mHandler.removeCallbacks(mUpdateTimeTask);
mp.release();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_music_setting, menu);
Tools.changeMenuIconColor(menu, Color.WHITE);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
finish();
} else {
Snackbar.make(parent_view, item.getTitle(), Snackbar.LENGTH_SHORT).show();
}
return super.onOptionsItemSelected(item);
}
}