介绍:
  你可以想像一下在cell phoneh一种流行的方式上去加载音乐.它将借助可移动的存储方介质,如SD card.在第1部分media play教程里,我们将创建一个简单的media player,它将允许用户从SD card里面去选择一首歌曲同时还可以进行播放.
  Layout:
  此项目由一个Activity,一个ListActivity组成。因此,对于ListActivity我们需要一个ListView来适用于这个实际的list,同时另一个View将被用于这个list每一项.对于这个例子我们将用一个TextView去显示每一个文件的名字。
  首先,这里看到的是我们的ListView(songlist.xml): 复制内容到剪贴板
  代码:

<?xml version="1.0" encoding="UTF-8"?> 

<LinearLayout xmlns:android=http://schemas.android.com/apk/res/android 

androidrientation="vertical" 

android:layout_width="fill_parent" 

android:layout_height="fill_parent"> 


<ListView id="@id/android:list" 

android:layout_width="fill_parent" 

android:layout_height="fill_parent" 

android:layout_weight="1" 

android:drawSelectorOnTop="false"/> 


<TextView id="@id/android:empty" 

android:layout_width="fill_parent" 

android:layout_height="fill_parent" 

android:text="No songs found on SD Card."/> 

</LinearLayout>


  非常标准的ListView。当ListView里面没有条目时在这个布局里面用这个来表示:"@id/android:empty".这个TextView 条目将显示,同时在TextView里每一个这里都要被用于(song_item.xml):复制内容到剪贴板
  代码:
<?xml version="1.0" encoding="utf-8"?>
<TextView id="@+id/text1"xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="wrap_content"
  android:layout_height="wrap_content"/>你也许会想,为什么屏幕截图上显示的是一个黑色的ListView,layout上面没有提起任何颜色的设置?很好,这就是在AndroidManifest.xml文件里面定制的”theme(主题)”。在”应用程序”原素你能够定义这样的主题,增加:"android:theme="@android:style/Theme.Dark""。

  ListActivity:
  我们现在开始工作我们的ListActivity,我们将调用MusicDroid.这里是这个类和onCreate()功能的声明: 复制内容到剪贴板
代码:

public class MusicDroid extends ListActivity { 


private static final String MEDIA_PATH = new String("/sdcard/"); 


private List<String> songs = new ArrayList<String>(); 


private MediaPlayer mp = new MediaPlayer(); 


private int currentPosition = 0; 


@Override 


public void onCreate(Bundle icicle) { 


super.onCreate(icicle); 


setContentView(R.layout.songlist); 


updateSongList(); 


}



  首先我们将设置一个私有成员变量用被用于这个Activity。第一个是MEDIA_PATH,同时我们设置它为”/sdcard”因为这是SD card位置。接下来有一个String类型的list它将包含这每一首歌曲的名字在list里.同时我们当然还需要一个MediaPlayher对象.我们称为mp.最后一个就是我们向上时,需要确定位置currentPosition,我们将用于存放当前正在播放的这首歌曲的索引.
  onCreate()功能是相当基础的,我们设置我们的View让它成为这个songlist view我们在这之上进行创建同时调用这个updateSonglist()功能,这里就是这个功能的内容: 复制内容到剪贴板
  代码:

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); 


} 

}



  这里我们创建一个File对象并称为”home”指向”/sdcard”.我们在home.ListFiles()里对这些文件中进行循环并返回.增加每一个文件到我们的List对象(songs)里.一旦我们这个list装满了我们就创建一个ArrayAdapter进入这个songs list同时设置它到我们的ListActivity的ListAdapter(如:setListAdapter(songList);).这样就落户在我们的  ListView.
  你也许留意到这个对象”Mp3Filter”.这是一个对象它实现FilenameFiter(文件名过滤).这个对象被用于过滤,文件通过它以后返回, 实现了这个accept(File,String)功能, 也就完成了.
这里的这个对象我们能用于过滤,因此listFiles()仅仅返回的是Mp3的文件: 复制内容到剪贴板
代码:

class Mp3Filter implements FilenameFilter { 


public boolean accept(File dir, String name) { 


return (name.endsWith(".mp3")); 


} 

}



  现在我们应该能够去创建一个在/sdcard路径下所有mp3的list了.因此现在我们需要能够选择一首歌曲并且进行播放.第一件事首先,让我们重载onListItemClick()方法因此当一首歌曲被点击时将通知我们: 复制内容到剪贴板
  代码:

@Override 

protected void onListItemClick(ListView l, View v, int position, long id) { 


currentPosition = position; 


playSong(MEDIA_PATH + songs.get(position)); 

}



  相当基础的功能在这里.我们设置currentPosition,它里面包含了这个选中位置的索引这样点击的同时我们通过路径找到此歌曲并进行播放,因此我们去看看在playSong(String)里面到底发生了什么:
复制内容到剪贴板
  代码:

private void playSong(String songPath) { 


try { 

mp.reset(); 


mp.setDataSource(songPath); 


mp.prepare(); 


mp.start(); 


// Setup listener so next song starts automatically 


mp.setOnCompletionListener(new OnCompletionListener() { 


public void onCompletion(MediaPlayer arg0) { 


nextSong(); 


} 


}); 


} catch (IOException e) { 


Log.v(getString(R.string.app_name), e.getMessage()); 


} 

}



  对于我们这里这个MediaPlayer对象使一些事情真的容易了许多.首先我们调用mp.reset(),这样做将重置MediaPlayer到它的正常的状态.这是必须的如果我们正在放一首歌曲同时又想去改变这个数据源.这个reset()功能将也停止任何正在播放的歌曲.因此如果一首歌曲是播放状态同时我们又要选择另一首歌曲那么它将在启动下一首歌曲之前停止这首正在播放的歌曲.
  我们然后通过路径找到这首歌曲(mp.setDataSource(String))同时调用prepare()和start().在这里指向MediaPlayer将启动播放你的歌曲.
  接下来的工作就是去装备一个OnCompletionListener (mp.setOnCompletionListener(new OnCompletionListener()启动).在歌曲结束的时候,onCompletion(MediaPlayer) 这个功能将被调用.所有的我们做的这些都是从我们的Activity中调用nextSong()功能.这里是nextSong(): 复制内容到剪贴板
  代码:

private void nextSong() { 


if (++currentPosition >= songs.size()) { 


// Last song, just reset currentPosition 


currentPosition = 0; 


} else { 


// Play next song 


playSong(MEDIA_PATH + songs.get(currentPosition)); 


  } 

}