Sunteți pe pagina 1din 6

Music Player

Pentru acest proiect mi-am propus sa pot vedea o lista de melodii si sa imi pot alege melodia
dorita din lista. Pentru redare este suficient un singur click.
Pentru ca vad lista de melodii nu este nevoie de butone “sari la urmatoarea melodie” sau
“canta melodia precedenta” asa ca am implementat butoane care sa sara peste anumite pasaje
5 secunde inainte sau inapoi si butoane pentru pauza si reia redarea.
Butoanele pauza si reia redarea se activeaze/dezactiveaza unul pe celalalt.
O alta caracteristica care mi s-a parut utila este o metoda a sti in ce punct a ajuns redarea unei
anumite melodii asa ca am implementat o bara de progress.
Si cum nu intotdeauna ascultam melodii cunoscute am afisat numele melodiei care este in
redare.
Pentru redare am folosit media player-ul nativ android. Lista de melodii a fost populata cu
resurse audio raw.
Melodiile le-am incarcat in folderul “raw” si le-am integrat in aplicatie intr-o matricea de tip int
denumita “Songs”:
int[] Songs = {R.raw.song11,R.raw.song12,R.raw.song13….}
Ca sa afisez o lista frumoasa de melodii cu numele artistului si cu numele melodiei am folosit o
matrice de string-uri denumita “Titles”:
String[] Titles = {
"UB40 - Cherry of Baby",
"UB40 - Come out to play",
"UB40 - Cos it is't true",

}

In continuare am definit butoanele, media player-ul si timpul din melodie pe care sa il sara
(inainte sau inapoi), bara de progress si un handler afisa la 100 milisecunde noua locatie a barei
de progress precum si o lista textview folosita pentru afisarea melodiilor :

private Button b1,b2,b3,b4;


private Handler myHandler = new Handler();
private int forwardTime = 5000;
private int backwardTime = 5000;
private SeekBar seekbar;
private TextView tx3;

Pentru a active/dezactiva butoanele pauza si redare am folosito variabila de tip int denumita
sugestiv oneTimeOnly:
public static int oneTimeOnly = 0;

La pornirea aplicatiei este apelata functia urmatoare populeaza lista de melodii, initializeaza
variabilele definite anterior si randeaza aplicatia pe ecranul telefonului

Adapterul este folosit pentru popularea listei din XML cu valorile java Titles
ArrayAdapter adapter = new ArrayAdapter<>(this,
R.layout.listview, Titles);

Tx3 este variabila java care se refera la obiectul textview4 din xml si care afiseaza numele
artistului si al melodiei.
tx3 = (TextView)findViewById(R.id.textView4);

Pentru urmarirea modificarilor la bara de progres am folosit functia:


seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
int progress = 0;
@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
progress = i;
}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {

@Override
public void onStopTrackingTouch(SeekBar seekBar) {
mediaPlayer.seekTo(progress);
}
});

Cand nu mai trag de bara de progress pentu a sari in melodie conform acesteia am folosit
functia:
public void onStopTrackingTouch(SeekBar seekBar) {
mediaPlayer.seekTo(progress);
}

Butonul 3 (redare) are definita o functie care activeaza butonul 2 si reia redarea.
b3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getApplicationContext(), "Playing sound",Toast.LENGTH_SHORT).show();
mediaPlayer.start();
finalTime = mediaPlayer.getDuration();
startTime = mediaPlayer.getCurrentPosition();

if (oneTimeOnly == 0) {
seekbar.setMax((int) finalTime);
oneTimeOnly = 1;
}

seekbar.setProgress((int)startTime);
myHandler.postDelayed(UpdateSongTime,100);
b2.setEnabled(true);
b3.setEnabled(false);
}
});

Butonul 2 (pauza) opreste redarea in punctul in care a ajuns si activeaza butonul 3


b2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getApplicationContext(), "Pausing sound",Toast.LENGTH_SHORT).show();
mediaPlayer.pause();
b2.setEnabled(false);
b3.setEnabled(true);
}
});

Butoanele b1 si b4 au associate functii si au rolul sa modifce punctul de redare (doar daca este
posibil, verifica inainte de a modifica)
b1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int temp = (int)startTime;

if((temp+forwardTime)<=finalTime){
startTime = startTime + forwardTime;
mediaPlayer.seekTo((int) startTime);
Toast.makeText(getApplicationContext(),"You have Jumped forward 5
seconds",Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(getApplicationContext(),"Cannot jump forward 5
seconds",Toast.LENGTH_SHORT).show();
}
}
});

In timpul redarii functia care se ocupa de modificarea pozitiei barei de progress este
private Runnable UpdateSongTime = new Runnable() {
public void run() {
startTime = mediaPlayer.getCurrentPosition();
a seekbar.setProgress((int)startTime);
myHandler.postDelayed(this, 100);
}
};

Pentru a fi afisat frumos pe ecran am folosit urmatorul aranjament (layout):


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
tools:context=".MainActivity">

<TextView android:text="Music Player" android:layout_width="wrap_content"


android:layout_height="wrap_content"
android:id="@+id/textview"
android:textSize="35dp"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true" />

<ListView
android:id="@+id/listview"
android:layout_width="wrap_content"
android:layout_below="@+id/textview"
android:layout_above="@+id/textView4"
android:layout_height="wrap_content">

</ListView>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/rewind"
android:id="@+id/button4"
android:layout_alignParentBottom="true"
android:layout_alignParentStart="true" />

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/pause"
android:id="@+id/button2"
android:layout_alignParentBottom="true"
android:layout_toEndOf="@+id/button4" />

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/back"
android:id="@+id/button3"
android:layout_alignTop="@+id/button2"
android:layout_toStartOf="@+id/button" />

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/forward"
android:id="@+id/button"
android:layout_alignTop="@+id/button3"
android:layout_alignParentEnd="true" />

<SeekBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/seekBar"
android:layout_alignStart="@+id/textview"
android:layout_alignEnd="@+id/textview"
android:layout_above="@+id/button" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="Medium Text"
android:id="@+id/textView4"
android:layout_above="@id/seekBar"
android:layout_centerHorizontal="true" />

</RelativeLayout>

S-ar putea să vă placă și