1.
Cara
Kerja
Applikasi
ini bekerja dengan cara membaca file musik pada folder Music yang terdapat pada
memory internal HP tetapi hanya file yang mempunyai ekstensi yang telah di
tentukan. Kemudian menyimpan nama file musik tersebut pada array dan memanggil
nya secara sekuensial.
1.
Source code
main.xml
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/screen" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#FFFFFF"><Buttonandroid:id="@+id/btnPlay"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignBaseline="@+id/btnPrevious"android:layout_alignBottom="@+id/btnPrevious"android:layout_centerHorizontal="true"android:background="@drawable/play"android:onClick="click" /><Buttonandroid:id="@+id/btnNext"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignBaseline="@+id/btnPlay"android:layout_alignBottom="@+id/btnPlay"android:layout_marginLeft="25dp"android:layout_toRightOf="@+id/btnPlay"android:background="@drawable/next"android:onClick="click" /><Buttonandroid:id="@+id/btnPrevious"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerVertical="true"android:layout_marginRight="26dp"android:layout_toLeftOf="@+id/btnPlay"android:background="@drawable/previous"android:onClick="click" /></RelativeLayout>
AndroidManifest.xml
|
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.technegames.mymediaplayer"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="18"
/>
<application android:label="@string/app_name">
<activity android:name="com.example.musicplayer.MusicPlayer"
android:configChanges="orientation|keyboardHidden"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"
/>
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.WAKE_LOCK" />
</manifest>
|
Music.java
|
package
com.example.musicplayer;
import
java.io.FileDescriptor;
import
java.io.IOException;
import
android.content.res.AssetFileDescriptor;
import
android.media.MediaPlayer;
import
android.media.MediaPlayer.OnCompletionListener;
public
class Music implements OnCompletionListener{
MediaPlayer mediaPlayer;
boolean isPrepared = false;
public Music(AssetFileDescriptor
assetDescriptor){
mediaPlayer = new MediaPlayer();
try{
mediaPlayer.setDataSource(assetDescriptor.getFileDescriptor(),
assetDescriptor.getStartOffset(), assetDescriptor.getLength());
mediaPlayer.prepare();
isPrepared = true;
mediaPlayer.setOnCompletionListener(this);
} catch(Exception ex){
throw new
RuntimeException("Tidak dapat meng-load lagu");
}
}
public Music(FileDescriptor
fileDescriptor){
mediaPlayer = new MediaPlayer();
try{
mediaPlayer.setDataSource(fileDescriptor);
mediaPlayer.prepare();
isPrepared = true;
mediaPlayer.setOnCompletionListener(this);
} catch(Exception ex){
throw new
RuntimeException("Tidak dapat meng-load lagu");
}
}
public void onCompletion(MediaPlayer
mediaPlayer) {
synchronized(this){
isPrepared = false;
}
}
public void play() {
if(mediaPlayer.isPlaying()){
return;
}
try{
synchronized(this){
if(!isPrepared){
mediaPlayer.prepare();
}
mediaPlayer.start();
}
} catch(IllegalStateException
ex){
ex.printStackTrace();
} catch(IOException ex){
ex.printStackTrace();
}
}
public void stop() {
mediaPlayer.stop();
synchronized(this){
isPrepared = false;
}
}
public void switchTracks(){
mediaPlayer.seekTo(0);
mediaPlayer.pause();
}
public void pause() {
mediaPlayer.pause();
}
public boolean isPlaying() {
return mediaPlayer.isPlaying();
}
public boolean isLooping() {
return mediaPlayer.isLooping();
}
public void setLooping(boolean
isLooping) {
mediaPlayer.setLooping(isLooping);
}
public void setVolume(float volumeLeft,
float volumeRight) {
mediaPlayer.setVolume(volumeLeft,
volumeRight);
}
public void dispose() {
if(mediaPlayer.isPlaying()){
stop();
}
mediaPlayer.release();
}
}
|
MusicPlayer.java
|
package
com.example.musicplayer;
import
java.io.File;
import
java.io.FileDescriptor;
import
java.io.FileInputStream;
import
java.io.IOException;
import
java.util.ArrayList;
import
java.util.List;
import
java.util.Random;
import
com.technegames.mymediaplayer.R;
import
android.app.Activity;
import
android.content.Context;
import
android.content.res.AssetFileDescriptor;
import
android.content.res.AssetManager;
import
android.graphics.drawable.Drawable;
import
android.media.AudioManager;
import
android.os.Bundle;
import
android.os.Environment;
import
android.os.PowerManager;
import
android.os.PowerManager.WakeLock;
import
android.view.Menu;
import
android.view.MenuItem;
import
android.view.View;
import
android.view.Window;
import
android.view.WindowManager;
import
android.widget.Button;
import
android.widget.ImageView;
import
android.widget.Toast;
public
class MusicPlayer extends Activity {
WakeLock wakeLock;
private static final String[]
EXTENSIONS = { ".mp3", ".mid", ".wav",
".ogg", ".mp4", ".m4a" }; //Playable Extensions
List<String> trackNames;
File path;
File path2;
Music track;
Button btnPlay;
boolean isTuning;
int currentTrack;
@Override
public void onCreate(Bundle
savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setVolumeControlStream(AudioManager.STREAM_MUSIC);
PowerManager powerManager =
(PowerManager) getSystemService(Context.POWER_SERVICE);
wakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK,
"Lexiconda");
setContentView(R.layout.main);
initialize();
}
@Override
public void onResume(){
super.onResume();
wakeLock.acquire();
}
@Override
public void onPause(){
super.onPause();
wakeLock.release();
if(track != null){
if(track.isPlaying()){
track.pause();
isTuning = false;
btnPlay.setBackgroundResource(R.drawable.play);
}
if(isFinishing()){
track.dispose();
finish();
}
} else{
if(isFinishing()){
finish();
}
}
}
private void initialize(){
btnPlay = (Button)
findViewById(R.id.btnPlay);
btnPlay.setBackgroundResource(R.drawable.play);
trackNames
= new ArrayList<String>();
currentTrack
= 0;
addTracks(getTracks());
loadTrack();
}
private String[] getTracks(){
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)
||
Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED_READ_ONLY)){
path
= Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC);
path2
=
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
String[] temp =
path.list();
return temp;
} else{
Toast.makeText(getBaseContext(),
"SD Card is either mounted elsewhere or is unusable",
Toast.LENGTH_LONG).show();
}
return
null;
}
private void addTracks(String[] temp){
if(temp
!= null){
for(int i = 0; i <
temp.length; i++){
if(trackChecker(temp[i])){
trackNames.add(temp[i]);
}
}
Toast.makeText(getBaseContext(),
"Loaded " + Integer.toString(trackNames.size()) + "
Tracks", Toast.LENGTH_SHORT).show();
}
}
private boolean trackChecker(String
trackToTest){
for(int
j = 0; j < EXTENSIONS.length; j++){
if(trackToTest.contains(EXTENSIONS[j])){
return true;
}
}
return
false;
}
private void loadTrack(){
if(track
!= null){
track.dispose();
}
if(trackNames.size()
> 0){
track
= loadMusic(1);
}
}
private Music loadMusic(int type){
switch(type){
case
1:
try{
FileInputStream
fis = new FileInputStream(new File(path, trackNames.get(currentTrack)));
FileDescriptor
fileDescriptor = fis.getFD();
return
new Music(fileDescriptor);
}
catch(IOException e){
e.printStackTrace();
Toast.makeText(getBaseContext(),
"Error Loading " + trackNames.get(currentTrack),
Toast.LENGTH_LONG).show();
}
return
null;
default:
return
null;
}
}
public void click(View view){
int id = view.getId();
switch(id){
case R.id.btnPlay:
synchronized(this){
if(isTuning){
isTuning =
false;
btnPlay.setBackgroundResource(R.drawable.play);
track.pause();
} else{
isTuning =
true;
btnPlay.setBackgroundResource(R.drawable.pause);
playTrack();
}
}
return;
case R.id.btnPrevious:
setTrack(0);
loadTrack();
playTrack();
return;
case R.id.btnNext:
setTrack(1);
loadTrack();
playTrack();
return;
default:
return;
}
}
private void setTrack(int direction){
if(direction
== 0){
currentTrack--;
if(currentTrack < 0){
currentTrack =
trackNames.size()-1;
}
}
else if(direction == 1){
currentTrack++;
if(currentTrack >
trackNames.size()-1){
currentTrack = 0;
}
}
}
private void playTrack(){
if(isTuning
&& track != null){
track.play();
Toast.makeText(getBaseContext(),
"Playing " + trackNames.get(currentTrack).substring(0,
trackNames.get(currentTrack).length()-4), Toast.LENGTH_SHORT).show();
}
}
}
|