 |
|
|  |
Media Player¸¦ ÀÌ¿ëÇÑ À½¾Ç Àç»ý |
|
|
 |
8³â Àü |
public class MusicPlayer extends ListActivity {
private static final String MEDIA_PATH = new String("/sdcard/");
// ROOT °æ·Î¸¦ ÁöÁ¤ÇÕ´Ï´Ù.
private List<String> songs = new ArrayList<String>();
private MediaPlayer mp = new MediaPlayer();
private int currentPosition = 0;
// Àç»ýÇÒ °îÀÇ À§Ä¡ÀÔ´Ï´Ù.
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
updateSongList();
// SDÄ«µå·ÎºÎÅÍ ÆÄÀÏ ¸ñ·ÏÀ» ºÒ·¯¿À´Â ¿ªÇÒÀ» ÇÕ´Ï´Ù.
}
}
À§ÀÇ Äڵ忡¼, ÀÏÀÏÀÌ /sdcard/¸¦ ÆÄÀÏ °æ·Î¿¡ ³Ö¾îÁÖ´Â ºÒÆíÇÔÀ» ÃÖ¼ÒÈÇϱâ À§ÇØ MEDIA_PATH·Î SDÄ«µåÀÇ ·çÆ® °æ·Î¸¦ ÁöÁ¤ÇØÁÖ¾ú½À´Ï´Ù. ±× ¾Æ·¡¿¡¼´Â songs¶ó´Â ¸®½ºÆ®¸¦ »ý¼ºÇØÁÖ°í Àִµ¥, ¿©±â¿¡ ¿ì¸®°¡ Àç»ýÇÒ ÆÄÀÏÀÇ ¸ñ·ÏÀÌ µé¾î°¡°Ô µË´Ï´Ù. currentPositionÀº ArrayList¿¡¼ÀÇ ¹è¿ À妽º°ªÀ¸·Î, ¾î¶² °îÀ» Àç»ýÇÒÁö ¼±ÅÃÇØÁÖ´Â ¿ªÇÒÀ» ÇÕ´Ï´Ù.
onCreateÇÔ¼ö·Î ¿À°Ô µÇ¸é, updateSongList() ¸Þ¼Òµå¸¦ º¸½Ç ¼ö ÀÖ½À´Ï´Ù. ÀÌ updateSongList()¸Þ¼Òµå¿¡¼´Â sdÄ«µå·ÎºÎÅÍ ÆÄÀÏÀ» Àоîµé¿© songs ¸®½ºÆ®¿¡ ³Ö¾î ÁÖ´Â ¿ªÇÒÀ» ÇÕ´Ï´Ù.
public void updateSongList() {
File home = new File(MEDIA_PATH);
// homeÀ¸·Î sdÄ«µåÀÇ root¸¦ ÁöÁ¤ÇÕ´Ï´Ù.
if (home.listFiles(new Mp3Filter()).length > 0) {
for (File file : home.listFiles(new Mp3Filter())) {
songs.add(file.getName());
// Àç»ý¸ñ·Ï ¸®½ºÆ®¿¡ ÆÄÀÏ À̸§À» Ãß°¡ÇÕ´Ï´Ù.
}
ArrayAdapter&;lt;String> songList = new ArrayAdapter<String>(this,
R.layout.song_item, songs);
// ListViewÀÇ ·¹À̾ƿô ¹× ÂüÁ¶ÇÒ ¸®½ºÆ®¸¦ ¼³Á¤ÇÕ´Ï´Ù.
setListAdapter(songList);
// ListView¿Í ArrayList¸¦ ¿¬°áÇÕ´Ï´Ù.
}
}
¿©±â¿¡¼ sdÄ«µåÀÇ ÆÄÀϵéÀ» Çϳª¾¿ °ÅÃÄ°¡¸é¼ mp3 È®ÀåÀÚ¸¦ °¡Áö°í ÀÖ´Â ÆÄÀϵéÀ» ã¾Æ¼ ¸®½ºÆ®¿¡ ³Ö¾îÁÖ°Ô µË´Ï´Ù.
ÀÌ ºÎºÐÀº Àúµµ óÀ½ º¸´Â °ÍÀ̶ó ÀÚ¼¼ÇÏ°Ô ¼³¸íÇϱⰡ ¾î·Æ³×¿ä. ÀÏ´ÜÀº ÀÌ ¿¹Á¦¸¦ ¹ßÀü½ÃÄѼ ´ÙÀ½ ¿¡Á¦¿¡¼µµ °è¼Ó ½á¸ÔÀ»Å×´Ï, ÀÌ ÂÊ¿¡ ´ëÇؼ °øºÎ¸¦ ´õ ÇÏ°Ô µÇ¸é ¼³¸íÀ» Ãß°¡Çϵµ·Ï ÇÏ°Ú½À´Ï´Ù.
Mp3Filter Ŭ·¡½º´Â ´ÙÀ½°ú °°ÀÌ ±¸¼ºµÇ¾î ÀÖ½À´Ï´Ù.
À§¿¡¼ º¸½Ã¸é, ListViewÀÇ ·¹À̾ƿôÀ¸·Î song_itemÀ» Ãß°¡ÇØÁÖ´Â °ÍÀ» º¼ ¼ö Àִµ¥, song_itemÀÇ ³»¿ëÀº ´ÙÀ½°ú °°½À´Ï´Ù.
class Mp3Filter implements FilenameFilter {
public boolean accept(File dir, String name) {
return (name.endsWith(".mp3"));
}}
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content" id="@+id/song_item_layout" android:layout_width="fill_parent" android:textSize="15px"/>
Å©°Ô ¾î·Á¿î °ÍÀº ¾ø°í, 15pxÀÇ Å©±â¸¦ °¡Áö´Â TextViewÀÔ´Ï´Ù. ¸®½ºÆ®¿¡¼ Ç׸ñÀº ÀÌ°÷¿¡ ÁöÁ¤µÈ ·¹À̾ƿôó·³ Ç¥½ÃµÉ °ÍÀÔ´Ï´Ù.
ÀÌÁ¦, ¸ñ·ÏÀ» Ŭ¸¯ÇÏ¸é ´ÙÀ½ °îÀ» Àç»ýÇÒ ¼ö ÀÖµµ·Ï ¸¸µé¾îº¸°Ú½À´Ï´Ù.
ListViewÀÇ OnListItemClick ¸Þ¼Òµå¸¦ ¿À¹ö¶óÀ̵åÇÏ¿© ±¸ÇöÇÕ´Ï´Ù.
protected void onListItemClick(ListView l, View v, int position, long id) {
currentPosition = position;
playSong(MEDIA_PATH + songs.get(position));
}
Ŭ¸¯ÇÑ Ç׸ñÀÇ index¸¦ Àç»ýÇÒ Ç׸ñÀ» ³ªÅ¸³»´Â currentPosition¿¡ ÀúÀåÇÏ°í, playSong()¸Þ¼Òµå·Î ÆÄÀÏÀÇ °æ·Î¸¦ ³Ñ°ÜÁÖ¸é¼ Àç»ýÀ» ÇÏ°Ô²û µÇ¾îÀÖ½À´Ï´Ù. ¾Æ±î MEDIA_PATH¿¡¼ SDÄ«µåÀÇ root ÁÖ¼Ò¸¦ ÀúÀåÇÏ°í ÀÖ¾ú°í, ÆÄÀÏ À̸§À» ´ã°í ÀÖ´Â songs¸®½ºÆ®¿¡¼ ¼±ÅÃÇÑ Ç׸ñÀ» ¹Þ¾Æ¿À´Â get()¸Þ¼Òµå¸¦ ÅëÇØ ÇϳªÀÇ ¿Ï¼ºµÈ ÁÖ¼Ò°¡ µÇ¾î playSong()¸Þ¼Òµå·Î ³Ñ°ÜÁö°Ô µË´Ï´Ù.
ex)
µÎ¹ø° Ç׸ñÀ» ¼±ÅÃÇÑ °æ¿ì
position : 1
currentPosition : 1
songs.get(position) : 13_piano_solo.mp3
private void playSong(String songPath) {
try {
mp.reset();
// mp°´Ã¼¸¦ ÃʱâÈÇÕ´Ï´Ù.
mp.setDataSource(songPath);
mp.prepare();
mp.start();
Toast.makeText(this, "Àç»ý : " + songPath, Toast.LENGTH_SHORT).show();
TextView status = (TextView)findViewById(R.id.playStatus);
status.setText("Àç»ýÁß : " + songPath);
// ÇÑ °îÀÇ Àç»ýÀÌ ³¡³ª¸é ´ÙÀ½ °îÀ» Àç»ýÇϵµ·Ï ÇÕ´Ï´Ù.
mp.setOnCompletionListener(new OnCompletionListener() {
public void onCompletion(MediaPlayer arg0) {
nextSong();
}
});
} catch (IOException e) {
Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
}
}
playSong()¸Þ¼Òµå¿¡¼´Â ÆÄÀÏÀ» Àç»ýÇØÁÖ´Â ¿ªÇÒÀ» ÇÕ´Ï´Ù.
reset()¸Þ¼Òµå¸¦ ÅëÇØ ´Ù¸¥ °îÀ» Àç»ýÇÒ ¼ö ÀÖ°Ô²û mp°´Ã¼¸¦ ÃʱâȽÃÄÑÁÖ°í, ±× ´ÙÀ½ °úÁ¤µéÀ» ÅëÇØ °´Ã¼¸¦ ÃʱâÈÇÏ°í, °æ·Î¸¦ ÁöÁ¤ÇÑ ÈÄ À½¾ÇÀ» Àç»ýÇÕ´Ï´Ù.
setOnCompletionListener()¸¦ ÅëÇØ, ÇÑ À½¾ÇÀÌ ³¡³µÀ» °æ¿ì ´ÙÀ½ À½¾ÇÀ» ºÒ·¯¿À´Â ±â´ÉÀ» Á¦°øÇÕ´Ï´Ù.
private void nextSong() {
if (++currentPosition >= songs.size()) {
// ¸¶Áö¸· °îÀÌ ³¡³ª¸é, Àç»ýÇÒ °îÀ» ÃʱâÈÇÕ´Ï´Ù.
currentPosition = 0;
TextView status = (TextView)findViewById(R.id.playStatus);
status.setText("ÁغñµÊ");
} else {
// ´ÙÀ½ °îÀ» Àç»ýÇÕ´Ï´Ù.
Toast.makeText(getApplicationContext(), "´ÙÀ½ °îÀ» Àç»ýÇÕ´Ï´Ù.", Toast.LENGTH_SHORT).show();
playSong(MEDIA_PATH + songs.get(currentPosition));
}
}
¸¸¾à, ÇÑ °îÀÇ Àç»ýÀÌ ³¡³ª ´ÙÀ½ °îÀ¸·Î ³Ñ¾î°¡¾ß Çϴµ¥ ÇöÀç °îÀÌ ¸¶Áö¸·ÀÏ °æ¿ì´Â Àç»ýÀ» ¸ØÃß°í Àç»ýÇÒ °îÀÇ index¸¦ ³ªÅ¸³»´Â currentPositionÀ» 0À¸·Î ÃʱâÈÇÏ°í, Àç»ý »óŸ¦ ³ªÅ¸³»´Â TextView¿¡ "ÁغñµÊ" ¸Þ½ÃÁö¸¦ Ç¥½ÃÇÕ´Ï´Ù.
Àç»ýÇÒ °îÀÌ ÀÖ´Ù¸é, ´ÙÀ½ °îÀÇ Á¤º¸¸¦ ºÒ·¯¿Í ´Ù½Ã playSong()¸Þ¼Òµå·Î ³Ñ°ÜÁÜÀ¸·Î½á Àç»ýÀ» °è¼ÓÇÕ´Ï´Ù.
¿Ï¼ºµÈ ¼Ò½º´Â ´ÙÀ½°ú °°½À´Ï´Ù.
package com.androidhuman.MusicPlayer;
import java.io.File;import java.io.FilenameFilter;
import java.io.IOException;import java.util.ArrayList;
import java.util.List;import android.app.ListActivity;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
public class MusicPlayer extends ListActivity {
private static final String MEDIA_PATH = new String("/sdcard/");
// ROOT °æ·Î¸¦ ÁöÁ¤ÇÕ´Ï´Ù.
private List<String> songs = new ArrayList<String>();
private MediaPlayer mp = new MediaPlayer();
private int currentPosition = 0;
// Àç»ýÇÒ °îÀÇ À§Ä¡ÀÔ´Ï´Ù.
/** Called when the activity is first created. */
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
updateSongList();
// SDÄ«µå·ÎºÎÅÍ ÆÄÀÏ ¸ñ·ÏÀ» ºÒ·¯¿À´Â ¿ªÇÒÀ» ÇÕ´Ï´Ù.
} public void updateSongList() {
File home = new File(MEDIA_PATH);
if (home.listFiles(new Mp3Filter()).length > 0) {
for (File file : home.listFiles(new Mp3Filter())) {
songs.add(file.getName());
}
ArrayAdapter<String> songList = new ArrayAdapter<String>(this, R.layout.song_item, songs);
setListAdapter(songList);
}
}
// List ¾ÆÀÌÅÛÀ» Ŭ¸¯ÇßÀ» ¶§ÀÇ event¸¦ ó¸®ÇÕ´Ï´Ù.
protected void onListItemClick(ListView l, View v, int position, long id) {
currentPosition = position;
playSong(MEDIA_PATH + songs.get(position));
}
private void playSong(String songPath) {
try {
mp.reset();
mp.setDataSource(songPath);
mp.prepare();
mp.start();
Toast.makeText(this, "Àç»ý : " + songPath, Toast.LENGTH_SHORT).show();
TextView status = (TextView)findViewById(R.id.playStatus);
status.setText("Àç»ýÁß : " + songPath);
// ÇÑ °îÀÇ Àç»ýÀÌ ³¡³ª¸é ´ÙÀ½ °îÀ» Àç»ýÇϵµ·Ï ÇÕ´Ï´Ù.
mp.setOnCompletionListener(new OnCompletionListener() {
public void onCompletion(MediaPlayer arg0) {
nextSong();
}
});
} catch (IOException e) {
Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
} } private void nextSong() {
if (++currentPosition >= songs.size()) {
// ¸¶Áö¸· °îÀÌ ³¡³ª¸é, Àç»ýÇÒ °îÀ» ÃʱâÈÇÕ´Ï´Ù.
currentPosition = 0;
TextView status = (TextView)findViewById(R.id.playStatus);
status.setText("ÁغñµÊ");
} else {
// ´ÙÀ½ °îÀ» Àç»ýÇÕ´Ï´Ù.
Toast.makeText(getApplicationContext(), "´ÙÀ½ °îÀ» Àç»ýÇÕ´Ï´Ù.", Toast.LENGTH_SHORT).show();
playSong(MEDIA_PATH + songs.get(currentPosition));
}
}
}
class Mp3Filter implements FilenameFilter {
public boolean accept(File dir, String name) {
return (name.endsWith(".mp3"));
}
}
main.xml ÀÇ ±¸¼ºÀº ´ÙÀ½°ú °°½À´Ï´Ù.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/playStatus"
android:gravity="center"
android:text="ÁغñµÊ"
android:textSize="13pt"></TextView>
<ListView
android:id="@id/android:list"
android:layout_height="fill_parent"
android:layout_width="fill_parent"
android:layout_weight="1"
android:drawSelectorOnTop="false"
>
</ListView>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="SDÄ«µå¿¡ À½¾ÇÀÌ ¾ø½À´Ï´Ù!"
android:layout_gravity="center"
android:id="@+id/android:empty"></TextView>
</LinearLayout>
À§ÀÇ ±¸¼ºÀ» º¸¸é, ¸Ç ¾Æ·¡¿¡ android:empty¶ó´Â id¸¦ °¡Áø TextView¸¦ º¸½Ç ¼ö ÀÖ½À´Ï´Ù.
ÀÌ´Â, ¸¸¾à list¿¡ Ç¥½ÃÇÒ Ç׸ñÀÌ Çϳªµµ ¾øÀ» °æ¿ì Ç¥½ÃµÇ´Â ȸéÀÔ´Ï´Ù.
android:empty¶ó´Â id´Â ¾Èµå·ÎÀ̵å ÀÚü¿¡¼ ¸¸µé¾îÁ® ÀÖ´Â idÀ̹ǷÎ, id¸¦ ÀÔ·ÂÇϸé ÇØ´ç »óȲ¿¡ ¸Â°Ô²û ȸéÀÌ º¸ÀÌ°Ô µË´Ï´Ù.
|
|
̵̧ : 361 |
̵̧
¸ñ·Ï
|
|
|  |
|