简单音乐播放器的设计与实现

本文将介绍如何在Andriod Studio设计制作一个简单音乐播放器

功能说明

第二次安卓开发,所以要求相对上次而言难度稍微加大了一点。该程序实现的主要功能有上一曲,下一曲,播放,暂停,退出,进度条拖拽实现音乐播放进度调整。

分析

所需工具

Android Studio

设计思路

1.首先,我们设计一个音乐播放器的大致布局如下,大概有五个button,上一曲,下一曲,暂停,播放,退出(因为只做一个项目演示,重在功能,所以在这里我个人比较懒,没有调样式);然后有一个imageview用来存放每一个歌曲对应的背景图片,有三个textview分别用来存放一些必须的歌曲信息以及说明文字,一个textview用来写描述文字为当前进度,然后一个textview用来存储歌曲名,一个在图片顶部,用来展示歌曲名字,另外一个用来现实当前播放进度,大概布局效果如下:(详细设计代码在文末代码仓库链接中,此处不做赘述)

界面布局文件效果展示

androidstudio音乐播放器完整教程 用androidstudio做音乐播放器_ide

2.创建一个文件夹raw文件夹,里面用来存放歌曲,以便程序能够更方便的访问到。

3.在drawable文件夹中,粘贴需要用到的对应歌曲的图标,或者背景图片。

4.在项目包中new一个Service类,在里面重写父类Service的一些重要方法,启动之后长时间工作在后台,配合Activity的调用来控制音乐播放的播放,暂停,进度条控制播放进度等行为。主要控制代码如下:(完整代码底部代码仓库有显示)

@Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        super.onStartCommand(intent, flags, startId);
        //用来对传递过来的消息类型做一个判断,然后对于指定的类型做指定的工作
        switch (intent.getIntExtra("type",-1)){
            //播放
            case 1:
                mediaPlayer.start();
                break;
                //暂停
            case 2:
                mediaPlayer.pause();
                break;
            case 3:
                //先重置播放器,然后设置下一首歌曲,这里采取循环加1的方式
                mediaPlayer.reset();
                now=(++now)%musicid.length;
                mediaPlayer=MediaPlayer.create(getApplicationContext(),musicid[now]);
                mediaPlayer.start();
                break;
            //先重置播放器,然后设置上一首歌曲,这里采取循环减1的方式
            case 4:
                mediaPlayer.reset();
                now=(--now)%musicid.length;
                mediaPlayer=MediaPlayer.create(getApplicationContext(),musicid[now]);
                mediaPlayer.start();
                break;
        }
        return START_STICKY;
    }

5.在MainActivity里面编写代码,(由于代码仓库有完整的代码,所以在下面我只介绍一些关键代码。)用来控制整个程序的运行。

首先定义一个内部类MyServiceConnection实现默认的ServiceConnection,然后在方法中实现myBinder用来获取当前Service对象

class MyServiceConnection implements ServiceConnection{
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            //初始化myBinder
            myBinder=(MyService1.MyBinder) service;
        }
        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    }

本程序中要实现歌曲播放的时候实时更新进度条,必须定义一个线程用来控制进度条的更新,Thread.sleep(1000);用来设置线程睡眠1s(1秒更新执行一次后续代码,即传递消息,以便实现进度条实时更新)代码如下

class MyThread1 extends Thread {
        public void run() {
            while (true) {
                try {
                    Thread.sleep(1000);
                    Message msg = new Message();
                    msg.what = 0x123;
                    handler.sendMessage(msg);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

        }
    }
    public Handler handler=new Handler(Looper.getMainLooper()){
        @Override
        public void handleMessage(@NonNull Message msg) {
            if(msg.what==0x123){
//                        MyService1.MyBinder myBinder1=(MyService1.MyBinder) myBinder;
                duration=myBinder.getMyService().Duration();
                currentPosition=myBinder.getMyService().CurrentPosition();
                int musicimage=myBinder.getMyService().getNowImage();
                String musicname=myBinder.getMyService().getNowName();
                //更新进度条和text1的内容
                Update(currentPosition,duration);
                //静态方法只执行一次
                init(musicimage,musicname);
            }
        }
    };

给seekBar设置一个setOnSeekBarChangeListener用来控制,实现拖动进度条调整播放进度,加上一个if(formUser)十分关键,用来判断是否是用户操作,如果是就执行,亲测可以很好的解决拖动卡顿的问题,代码如下

seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                //判断是不是用户操作,如果是就执行下列代码,可以很好的解决的卡顿问题
                if(fromUser){
                    myBinder.getMyService().seekTo(progress);
                }
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
                //根据拖动的进度改变音乐播放进度
                int progress=seekBar.getProgress();//获取seekBar的进度
                myBinder.getMyService().seekTo(progress);//改变播放进度
            }
        });

其它五个按钮的实现相对来说比较好实现(上一曲,下一曲,播放,暂停,退出),这里就不做赘述,以上就是全部对简单音乐播放器实现与开发的分析。如果还有什么疑问,可参照去下载文末所给的代码仓库下载并查看所有代码。如果还有疑问欢迎qq交流。

效果展示动态图

androidstudio音乐播放器完整教程 用androidstudio做音乐播放器_ide_02