Button next = (Button) findViewById(R.id.next); //获取“下一首”按钮
audioList(); //使用ListView组件显示SD卡上的全部音频文件
(4)编写audioList()方法,用于使用ListView组件显示SD卡上的全部音频文件。在该方法中,首先调用getFiles()方法获取SD卡上的全部音频文件,然后创建一个适配器,并获取布局管理器中添加的ListView组件,再将适配器与ListView关联,最后为ListView添加列表项单击事件监听器,用于当用户单击列表项时播放音乐。audioList()方法的具体代码如下:
private void audioList() {
getFiles("/sdcard/"); //获取SD卡上的全部音频文件
ArrayAdapter
android.R.layout.simple_list_item_1, audioList); //创建一个适配器
ListView listview = (ListView) findViewById(R.id.list); //获取布局管理器中添加的ListView组件
listview.setAdapter(adapter); //将适配器与ListView关联
//当单击列表项时播放音乐
listview.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView> listView, View view,int position, long id) {
currentItem = position; //将当前列表项的索引值赋值给currentItem
playMusic(audioList.get(currentItem)); //调用playMusic()方法播放音乐
}
});
}
(5)定义一个保存合法的音频文件格式的字符串数组,并编写根据文件路径判断文件是否为音频文件的方法,具体代码如下:
private static String[] imageFormatSet = new String[] { "mp3", "wav", "3gp" }; //合法的音频文件格式
//判断是否为音频文件
private static boolean isAudioFile(String path) {
for (String format : imageFormatSet) { //遍历数组
if (path.contains(format)) { //判断是否为合法的音频文件
return true;
}
}
return false;
}
(6)编写getFiles()方法,用于通过递归调用的方式获取SD卡上的全部音频文件,具体代码如下:
private void getFiles(String url) {
File files = new File(url); //创建文件对象
File[] file = files.listFiles();
try {
for (File f : file) { //通过for循环遍历获取到的文件数组
if (f.isDirectory()) { //如果是目录,也就是文件夹
getFiles(f.getAbsolutePath()); //递归调用
} else {
if (isAudioFile(f.getPath())) { //如果是音频文件
audioList.add(f.getPath()); //将文件的路径添加到List集合中
}
}
}
} catch (Exception e) {
e.printStackTrace(); //输出异常信息
}
}
(7)编写用于播放音乐的方法playMusic(),在该方法中,首先判断是否正在播放音乐,如果正在播放音乐,先停止播放,然后重置MediaPlayer,并指定要播放的音频文件,再预加载该音频文件,最后播放音频,并设置“暂停”按钮的显示文字及可用状态。playMusic()方法的具体代码如下:
void playMusic(String path) {
try {
if (mediaPlayer.isPlaying()) {
mediaPlayer.stop(); //停止当前音频的播放
}
mediaPlayer.reset(); //重置MediaPlayer
mediaPlayer.setDataSource(path); //指定要播放的音频文件
mediaPlayer.prepare(); //预加载音频文件
mediaPlayer.start(); //播放音频
pause.setText("暂停");
pause.setEnabled(true); //设置“暂停”按钮可用
} catch (Exception e) {
e.printStackTrace();
}
}
(8)编写实现“下一首”功能的方法nextMusic(),在该方法中,首先计算要播放音频的索引,然后调用playMusic()播放音乐。nextMusic()方法的具体代码如下:
void nextMusic() {
if (++currentItem >= audioList.size()) {//当对currentItem进行+1操作后,如果其值大于等于音频文件的总数
currentItem = 0;
}
playMusic(audioList.get(currentItem)); //调用playMusic()方法播放音乐
}
(9)编写实现“上一首”功能的方法preMusic(),在该方法中,首先计算要播放音频的索引,然后调用playMusic()播放音乐。preMusic()方法的具体代码如下:
void preMusic() {
if (--currentItem >= 0) { //当对currentItem进行-1操作后,如果其值大于等于0
if (currentItem >= audioList.size()) { //如果currentItem的值大于等于音频文件的总数
currentItem = 0;
}
} else {
currentItem = audioList.size() - 1; //currentItem的值设置为音频文件总数-1
}
playMusic(audioList.get(currentItem)); //调用playMusic()方法播放音乐