要做一个音乐播放器,首先我们需要分析,分为以下几步:
一、需要扫描sd卡,将音乐文件查找出来。然后以列表的形式,将所有音频文件显示出来。
二、当点击列表的子条目时,播放对应的音频文件。
三、当开始播放音频,需要seekbar显示出音乐播放的进度,以及拖动seekbar可以将音乐跳转到指定位置。并且歌曲名需要循环滚动。
四、实现暂停、停止、上一首、下一首按钮功能。
接下来,贴图,这是我做的,界面很简单,整体是一个线性布局,方向为竖直向下。
布局代码如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.jungle.musicplay.MusicActivity">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:text="音乐列表"
android:textSize="24sp" />
<ListView
android:id="@+id/lst_music"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:layout_weight="1"></ListView>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<HorizontalScrollView
android:id="@+id/hsv"
android:layout_width="50dp"
android:layout_height="wrap_content"
android:scrollbars="none"
android:fillViewport="true">
<TextView
android:id="@+id/music_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="歌名"
android:gravity="center"
android:singleLine="true"
android:textSize="16dp"/>
</HorizontalScrollView>
<SeekBar
android:id="@+id/skb"
android:layout_width="match_parent"
android:paddingLeft="15dp"
android:paddingRight="15dp"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="horizontal">
<Button
android:id="@+id/pre"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="上一首" />
<Button
android:id="@+id/pause"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="暂停" />
<Button
android:id="@+id/stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="停止" />
<Button
android:id="@+id/next"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="下一首" />
</LinearLayout>
</LinearLayout>
首先,在onCreate方法中,显示一个加载的进度条的对话框,开启一个线程去遍历sd卡,查找所有的音频文件,将路径保存到一个集合中。当查找完毕,在ui线程中关闭对话框。
dialog = new ProgressDialog(this);
dialog.setMessage("正在加载歌曲,请稍候");
dialog.show();
new Thread() {
@Override
public void run() {
super.run();
getFiles("/sdcard");
handler.sendEmptyMessage(1);
}
}.start();
```
其中的getFiles方法如下:
/**
* 递归调用获取sd卡上的全部音频文件
*
* @param url
*/
private void getFiles(String url) {
File file = new File(url);
File[] files = file.listFiles();
for (File f : files) {
if (f.isDirectory()) {
getFiles(f.getAbsolutePath());
} else {
if (isAudioFile(f.getPath())) {
audiolist.add(f.getPath());
}
}
}
}
判断是否是音频文件的方法isAudioFile代码如下:
/**
* 判断是否是音频文件
*
* @param path
* @return
*/
private boolean isAudioFile(String path) {
for (String format : imageFormatSet) {
if (path.contains(format)) {
return true;
}
}
return false;
}
当点击列表的子条目时,要播放对应的歌曲,播放歌曲的代码如下:
/**
* 播放音乐
*
* @param path
*/
private void playMusic(String path) {
try {
if (mMediaPlayer.isPlaying()) {
mMediaPlayer.stop();
mTimer.cancel();
}
mMediaPlayer.reset();
mMediaPlayer.setDataSource(path);
mMediaPlayer.prepare();
mMediaPlayer.start();
isChanging = true;
mSkb.setMax(mMediaPlayer.getDuration());
mName.setText(getName(path));
pause.setText(“暂停”);
pause.setEnabled(true);
mTimer = new Timer();
mTimerTask = new TimerTask() {
@Override
public void run() {
if (isChanging) {
mSkb.setProgress(mMediaPlayer.getCurrentPosition());
}
}
};
TimerTask task = new TimerTask() {
@Override
public void run() {
if (juli <= mName.getWidth()) {
juli += 1;
mScrollView.scrollTo(juli, 0);
} else {
juli = 0;
mScrollView.scrollTo(0, 0);
}
}
};
mTimer.schedule(mTimerTask, 0, 10);
mTimer.schedule(task, 0, 10);
} catch (IOException e) {
e.printStackTrace();
}
}
播放一首歌,需要先判断是否有音乐在播放,如果有,先停止。并且需要停止定时任务。在定时任务中,如果音乐正在播放,那么每个10毫秒,给seekbar设置进度,并且让包裹歌名的ScrollView进行滚动。
剩下的上一首,下一首,停止的按钮实现相对简单,直接贴代码了
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.pause://暂停和继续
if (mMediaPlayer.isPlaying()) {
mMediaPlayer.pause();
pause.setText(“继续”);
isChanging = false;
} else {
mMediaPlayer.start();
pause.setText(“暂停”);
isChanging = true;
}
break;
case R.id.stop://停止
if (mMediaPlayer.isPlaying()) {
mMediaPlayer.stop();
}
pause.setEnabled(false);
break;
case R.id.pre://上一首
if (–currentItem >= 0) {
if (currentItem >= audiolist.size()) {
currentItem = 0;
}
} else {
currentItem = audiolist.size() - 1;
}
playMusic(audiolist.get(currentItem));
break;
case R.id.next://下一首
if (++currentItem >= audiolist.size()) {
currentItem = 0;
}
playMusic(audiolist.get(currentItem));
break;
}
}
“`
可能讲的不够清楚吧,如果又不懂的地方,可以留言,谢谢。