基于Android的音乐播放器

要做一个音乐播放器,首先我们需要分析,分为以下几步:

一、需要扫描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;
}
}
“`
可能讲的不够清楚吧,如果又不懂的地方,可以留言,谢谢。

在播放界面点击除唱片外的任意一处区域可实现收藏按钮和模式选择按钮的显示,这俩个按钮是默认被隐藏的,再次点击界面上除唱片外的任意一处,这俩个按钮又会被隐藏起来。点击唱片会跳转到歌词显示的界面,如果在本机中有与歌词匹配的歌词文件,那么歌词会显示在此界面上,歌词以滚动的形式显示,而且会与歌曲的演唱匹配在歌词显示的界面有调节音量的拖动条,在歌词显示的界面点击红色的话筒按钮会退出此界面回到正在播放的界面,在正在播放的界面向右滑动会进入到信息显示的界面,在信息显示的界面点击歌手列表会显示出所有歌手的名字和头像,点击专辑列表显示出歌曲专辑的名称以及封面照片和发行时间,点击我的收藏会显示自己收藏的歌曲的名称,歌唱者以及歌曲的大小。此播放器的主要三个界面歌曲列表界面、正在播放界面、主要信息界面是以滑动的形式切换,在滑动切换界面后,每个界面的图标会相应的变色,当然也可以点击各界面的图标实现界面的切换。以上基本就是此播放器的所有功能了。 以上一大堆废话还是有些BUg的,而且做得也不太好,大家轻喷,马马虎虎看吧,做了3天,第一次上传,歌词文件一定要与歌曲文件同名,放在SD卡下,如果在genymotion中导入了歌曲和歌词,但运行程序不显示歌曲,那就需要重启genymotion了。总之欢迎下载吧。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值