1. Deskripsi Aplikasi
Aplikasi ini dibuat untuk memenuhi tugas mingguan, Aplikasi pemutar musik ini dibuat menggunakan Android studio, menggunakan custom listview dan juga dapat membaca lagu dengan sendirinya tanpa harus memasukan lagu pada saat pembuatan aplikasi.
2. Screenshoot Interface Aplikasi
3. Source Code XML dan Java
PlayerActivity.java
package com.heavenstudio.Multimedia; import android.annotation.SuppressLint;import android.content.Intent;import android.graphics.PorterDuff;import android.media.MediaPlayer;import android.net.Uri;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;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; public class PlayerActivity extends AppCompatActivity{ static MediaPlayer mp;//assigning memory loc once or else multiple songs will play at once int position; SeekBar sb; ArrayList<File> mySongs; Thread updateSeekBar; Button pause,next,previous; TextView songNameText; String sname; @SuppressLint("NewApi") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.music_player_ui); songNameText = (TextView) findViewById(R.id.txtSongLabel); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setDisplayShowHomeEnabled(true); getSupportActionBar().setTitle("Now Playing"); pause = (Button)findViewById(R.id.pause); previous = (Button)findViewById(R.id.previous); next = (Button)findViewById(R.id.next); sb=(SeekBar)findViewById(R.id.seekBar); updateSeekBar=new Thread(){ @Override public void run(){ int totalDuration = mp.getDuration(); int currentPosition = 0; while(currentPosition < totalDuration){ try{ sleep(500); currentPosition=mp.getCurrentPosition(); sb.setProgress(currentPosition); } catch (InterruptedException e){ } } } }; if(mp != null){ mp.stop(); mp.release(); } Intent i = getIntent(); Bundle b = i.getExtras(); mySongs = (ArrayList) b.getParcelableArrayList("songs"); sname = mySongs.get(position).getName().toString(); String SongName = i.getStringExtra("songname"); songNameText.setText(SongName); songNameText.setSelected(true); position = b.getInt("pos",0); Uri u = Uri.parse(mySongs.get(position).toString()); mp = MediaPlayer.create(getApplicationContext(),u); mp.start(); sb.setMax(mp.getDuration()); updateSeekBar.start(); sb.getProgressDrawable().setColorFilter(getResources().getColor(R.color.colorPrimary), PorterDuff.Mode.MULTIPLY); sb.getThumb().setColorFilter(getResources().getColor(R.color.colorPrimary), PorterDuff.Mode.SRC_IN); sb.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int i, boolean b) { } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { mp.seekTo(seekBar.getProgress()); } }); pause.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { sb.setMax(mp.getDuration()); if(mp.isPlaying()){ pause.setBackgroundResource(R.drawable.ic_play_arrow_black_24dp); mp.pause(); } else { pause.setBackgroundResource(R.drawable.pause); mp.start(); } } }); next.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mp.stop(); mp.release(); position=((position+1)%mySongs.size()); Uri u = Uri.parse(mySongs.get( position).toString()); // songNameText.setText(getSongName); mp = MediaPlayer.create(getApplicationContext(),u); sname = mySongs.get(position).getName().toString(); songNameText.setText(sname); try{ mp.start(); }catch(Exception e){} } }); previous.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //songNameText.setText(getSongName); mp.stop(); mp.release(); position=((position-1)<0)?(mySongs.size()-1):(position-1); Uri u = Uri.parse(mySongs.get(position).toString()); mp = MediaPlayer.create(getApplicationContext(),u); sname = mySongs.get(position).getName().toString(); songNameText.setText(sname); mp.start(); } }); } @Override public boolean onOptionsItemSelected(MenuItem item) { if(item.getItemId()==android.R.id.home){ onBackPressed(); } return super.onOptionsItemSelected(item); }}
Tunes.Java
package com.heavenstudio.Multimedia; import android.Manifest;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.content.Intent;import android.os.Environment;import android.view.View;import android.widget.AdapterView;import android.widget.ArrayAdapter;import android.widget.ListView; import com.karumi.dexter.Dexter;import com.karumi.dexter.PermissionToken;import com.karumi.dexter.listener.PermissionDeniedResponse;import com.karumi.dexter.listener.PermissionGrantedResponse;import com.karumi.dexter.listener.PermissionRequest;import com.karumi.dexter.listener.single.PermissionListener; import java.io.File;import java.util.ArrayList;public class Tunes extends AppCompatActivity { ListView listView; String[] items; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_tunes); listView = (ListView) findViewById(R.id.listView); Dexter.withActivity(this) .withPermission(Manifest.permission.READ_EXTERNAL_STORAGE) .withListener(new PermissionListener() { @Override public void onPermissionGranted(PermissionGrantedResponse response) { display(); } @Override public void onPermissionDenied(PermissionDeniedResponse response) { // check for permanent denial of permission if (response.isPermanentlyDenied()) { } } @Override public void onPermissionRationaleShouldBeShown(PermissionRequest permission, PermissionToken token) { token.continuePermissionRequest(); } }).check(); } public ArrayList<File> findSong(File root){ ArrayList<File> at = new ArrayList<File>(); File[] files = root.listFiles(); for(File singleFile : files){ if(singleFile.isDirectory() && !singleFile.isHidden()){ at.addAll(findSong(singleFile)); } else{ if(singleFile.getName().endsWith(".mp3") || singleFile.getName().endsWith(".wav")){ at.add(singleFile); } } } return at; } void display(){ final ArrayList<File> mySongs = findSong(Environment.getExternalStorageDirectory()); items = new String[ mySongs.size() ]; for(int i=0;i<mySongs.size();i++){ //toast(mySongs.get(i).getName().toString()); items[i] = mySongs.get(i).getName().toString().replace(".mp3","").replace(".wav",""); } ArrayAdapter<String> adp = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,items); listView.setAdapter(adp); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) { String songName = listView.getItemAtPosition(position).toString(); startActivity(new Intent(getApplicationContext(),PlayerActivity.class) .putExtra("pos",position).putExtra("songs",mySongs).putExtra("songname",songName)); } }); } }
activity_tunes.xml
<?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:id="@+id/activity_tune" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.heavenstudio.Multimedia.Tunes"> <ListView android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignParentTop="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:id="@+id/listView" /> </RelativeLayout>
music_player_ui.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:weightSum="10" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="0dp" android:gravity="center" android:padding="10dp" android:orientation="vertical" android:layout_weight="7"> <ImageView android:layout_width="250dp" android:layout_height="250dp" android:src="@drawable/cover_art" android:id="@+id/album_art" /> <TextView android:id="@+id/txtSongLabel" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="song name" android:singleLine="true" android:marqueeRepeatLimit="marquee_forever" android:layout_marginTop="20dp" android:textSize="22sp" android:textAlignment="center" android:ellipsize="marquee" android:scrollHorizontally="true" android:textColor="@color/colorPrimary" /> </LinearLayout> <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"> <SeekBar android:layout_alignParentBottom="true" android:id="@+id/seekBar" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="40dp" /> <Button android:layout_marginTop="5dp" android:layout_width="60dp" android:layout_height="60dp" android:layout_centerHorizontal="true" android:background="@drawable/pause" android:id="@+id/pause" /> <Button android:id="@+id/next" android:layout_width="40dp" android:layout_height="40dp" android:layout_toRightOf="@+id/pause" android:background="@drawable/ic_skip_next_black_24dp" android:layout_marginTop="15dp" android:layout_marginLeft="20dp" /> <Button android:id="@+id/previous" android:layout_width="40dp" android:layout_height="40dp" android:layout_marginTop="15dp" android:layout_marginRight="20dp" android:layout_toLeftOf="@+id/pause" android:background="@drawable/ic_skip_previous_black_24dp" /> </RelativeLayout> </LinearLayout> </LinearLayout>
Sekian dari saya, kurang lebihnya mohon maaf. Wassallam :)


Tidak ada komentar:
Posting Komentar