package com.example.musicplayer;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.graphics.PorterDuff;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.TextView;
import java.io.File;
import java.util.ArrayList;
import java.util.concurrent.TimeUnit;
public class PlayerActivity extends AppCompatActivity {
Button btn_pause, btn_next, btn_previous ;
TextView songTextLabel,currentTimeLabel,remainingTimeLabel;
SeekBar songSeekbar, volumeBar;
static MediaPlayer myMediaPlayer;
int position;
ArrayList<File> mySongs;
Thread updateseekBar;
String sname;
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_player);
btn_pause = (Button) findViewById(R.id.pause);
btn_previous = (Button) findViewById(R.id.previous);
btn_next = (Button) findViewById(R.id.next);
songTextLabel = (TextView) findViewById(R.id.songLabel);
songSeekbar = (SeekBar) findViewById(R.id.seekBar);
currentTimeLabel = (TextView) findViewById(R.id.CTime);
remainingTimeLabel = (TextView) findViewById(R.id.RTime);
volumeBar = (SeekBar) findViewById(R.id.volumeBar);
getSupportActionBar().setTitle("Now Playing");
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
updateseekBar = new Thread() {
@Override public void run() {
int totaldurtion = myMediaPlayer.getDuration();
int currentPosition = 0;
while (currentPosition<totaldurtion) {
try {
sleep(500);
currentPosition = myMediaPlayer.getCurrentPosition();
songSeekbar.setProgress(currentPosition);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
if(myMediaPlayer!=null) {
myMediaPlayer.stop();
myMediaPlayer.release();
}
Intent i = getIntent();
Bundle bundle = i.getExtras();
mySongs = (ArrayList) bundle.getParcelableArrayList("songs");
sname = mySongs.get(position).getName().toString();
final String songName = i.getStringExtra("songname");
songTextLabel.setText(songName);
songTextLabel.setSelected(true);
position = bundle.getInt("pos",0);
Uri u = Uri.parse((mySongs.get(position).toString()));
myMediaPlayer = MediaPlayer.create(getApplicationContext(),u);
myMediaPlayer.start();
songSeekbar.setMax(myMediaPlayer.getDuration());
updateseekBar.start();
songSeekbar.getProgressDrawable().setColorFilter(
getResources().getColor(R.color.colorPrimary), PorterDuff.Mode.MULTIPLY);
songSeekbar.getThumb().setColorFilter(
getResources().getColor(R.color.colorPrimary),PorterDuff.Mode.SRC_IN);
volumeBar.getProgressDrawable().setColorFilter(
getResources().getColor(R.color.colorPrimary), PorterDuff.Mode.MULTIPLY);
volumeBar.getThumb().setColorFilter(getResources().getColor(
R.color.colorPrimary),PorterDuff.Mode.SRC_IN);
myMediaPlayer.setVolume(0.5f,0.5f);
volumeBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
float volumeNum = progress/100f;
myMediaPlayer.setVolume(volumeNum,volumeNum);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
songSeekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
myMediaPlayer.seekTo(seekBar.getProgress());
}
});
btn_pause.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View v) {
songSeekbar.setMax(myMediaPlayer.getDuration());
if(myMediaPlayer.isPlaying()) {
btn_pause.setBackgroundResource(R.drawable.icon_play);
myMediaPlayer.pause();
}
else {
btn_pause.setBackgroundResource(R.drawable.icon_pause);
myMediaPlayer.start();
}
}
});
btn_next.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View v) {
myMediaPlayer.stop();
myMediaPlayer.release();
position = ((position+1)%mySongs.size());
Uri u = Uri.parse(mySongs.get(position).toString());
myMediaPlayer = MediaPlayer.create(getApplicationContext(),u);
sname = mySongs.get(position).getName().toString();
songTextLabel.setText(sname);
myMediaPlayer.setOnBufferingUpdateListener(
new MediaPlayer.OnBufferingUpdateListener() {
@Override
public void onBufferingUpdate(MediaPlayer mp, int percent) {
songSeekbar.setSecondaryProgress(percent);
}
});
myMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mediaPlayer) {
btn_pause.setEnabled(true);
}
});
myMediaPlayer.start();
}
});
btn_previous.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
myMediaPlayer.stop();
myMediaPlayer.release();
position = ((position-1)<0)?(mySongs.size()-1):(position-1);
Uri u = Uri.parse(mySongs.get(position).toString());
myMediaPlayer = MediaPlayer.create(getApplicationContext(),u);
sname = mySongs.get(position).getName().toString();
songTextLabel.setText(sname);
myMediaPlayer.setOnBufferingUpdateListener(
new MediaPlayer.OnBufferingUpdateListener() {
@Override
public void onBufferingUpdate(MediaPlayer mp, int percent) {
songSeekbar.setSecondaryProgress(percent);
}
});
myMediaPlayer.setOnPreparedListener(
new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mediaPlayer) {
btn_pause.setEnabled(true);
}
});
myMediaPlayer.start();
}
});
new Thread(new Runnable() {
@Override public void run() {
while (myMediaPlayer!=null) {
try {
Message msg = new Message();
msg.what = myMediaPlayer.getCurrentPosition();
handler.sendMessage(msg);
Thread.sleep(1000);
} catch (InterruptedException e) {}
}
}
}).start();
}
private Handler handler = new Handler() {
@Override public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
int currentPosition = msg.what;
int totalTime = myMediaPlayer.getDuration();
int remainingTime = totalTime - currentPosition;
currentTimeLabel.setText(String.format("%d:%d",
TimeUnit.MILLISECONDS.toMinutes((long) currentPosition),
TimeUnit.MILLISECONDS.toSeconds((long) currentPosition) -
TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.
toMinutes((long) currentPosition))));
remainingTimeLabel.setText(String.format("- %d:%d",
TimeUnit.MILLISECONDS.toMinutes((long) remainingTime),
TimeUnit.MILLISECONDS.toSeconds((long) remainingTime) -
TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.
toMinutes((long) remainingTime))));
}
};
@Override public boolean onOptionsItemSelected(@NonNull MenuItem item) {
if (item.getItemId() == android.R.id.home) {
onBackPressed();
}
return super.onOptionsItemSelected(item);
}
}
activity_player.xml source code as below :
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:weightSum="10"
tools:context=".PlayerActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="6.25"
android:gravity="center"
android:orientation="vertical">
<ImageView
android:id="@+id/SongImage"
android:layout_width="250dp"
android:layout_height="250dp"
android:layout_marginTop="30dp"
android:src="@color/cardview_dark_background">
</ImageView>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/lowVolume"
android:layout_width="33dp"
android:layout_height="38dp"
android:layout_marginLeft="15dp"
android:background="@drawable/icon_lowvolume"
android:layout_marginTop="26dp"
/>
<SeekBar
android:id="@+id/volumeBar"
android:layout_width="280dp"
android:layout_height="wrap_content"
android:layout_marginTop="35dp"
/>
<ImageView
android:id="@+id/highVolume"
android:layout_width="35dp"
android:layout_height="40dp"
android:background="@drawable/icon_highvolume"
android:layout_marginTop="23dp"
/>
</LinearLayout>
</LinearLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight=".5">
<TextView
android:id="@+id/songLabel"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Song Name"
android:layout_marginTop="35dp"
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
android:scrollHorizontally="true"
android:singleLine="true"
android:textAlignment="center"
android:textColor="@color/colorPrimary"
android:textSize="20sp"
/>
</RelativeLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="3">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="5dp"
>
<TextView
android:layout_width="50dp"
android:layout_height="15dp"
android:id="@+id/CTime"
android:layout_marginLeft="15dp"
android:text="00:00" />
<TextView
android:layout_width="50dp"
android:layout_height="15dp"
android:id="@+id/RTime"
android:layout_marginLeft="225dp"
android:text="00:00"
android:singleLine="true"
android:layout_toRightOf="@+id/CTime"
/>
<SeekBar
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/seekBar"
android:layout_below="@+id/CTime"
/>
<Button
android:layout_width="75dp"
android:layout_height="75dp"
android:layout_centerHorizontal="true"
android:background="@drawable/icon_pause"
android:layout_marginTop="25dp"
android:id="@+id/pause"
android:layout_below="@+id/seekBar"
/>
<Button
android:layout_width="55dp"
android:layout_height="55dp"
android:layout_marginTop="35dp"
android:layout_toRightOf="@id/pause"
android:id="@+id/next"
android:background="@drawable/icon_next"
android:layout_marginLeft="25dp"
android:layout_below="@+id/seekBar"
/>
<Button
android:layout_width="55dp"
android:layout_height="55dp"
android:layout_marginTop="35dp"
android:layout_marginRight="25dp"
android:id="@+id/previous"
android:layout_toLeftOf="@id/pause"
android:background="@drawable/icon_previous"
android:layout_below="@+id/seekBar"
/>
</RelativeLayout>
</LinearLayout>
</LinearLayout>
AndroidManifest.xml source code as below :
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.musicplayer">
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".PlayerActivity" />
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Manifest show in image for user permission below
0 Comments