Android Studio完成音乐盒demo

前言

使用Android Studio工具,利用其中的Service和Broadcast机制完成一个音乐盒demo。

附上项目链接🎈

基本功能

音乐盒demo实现的功能基本如下:

  1. 播放和暂停
    在正在播放时,点击播放键实现暂停功能,未播放时,点击播放键实现音乐的继续播放;
  2. 停止
    点击stop键实现停止播放;
  3. 上一首/下一首
    在音乐播放列表中,点击上一首/下一首实现音乐播放顺序的转换;
  4. 显示效果
    在播放音乐时,有两个textview显示正在播放音乐的标题和演唱者名。

开发参考

参考blog: 广播组件与通知.

项目运行效果截图

列表中共三首歌,以下的“上一首”/“下一首”均以第一首(会好的)为基准

  1. 播放音乐
    播放
  2. 下一首
    在这里插入图片描述
  3. 上一首(正在播放列表中第一首时,点击上一首播放列表中最后一首)
    上一首
  4. 暂停播放
    暂停播放
  5. 停止播放
    停止播放

项目核心代码🔑

  1. BroadcastReceiver
	// 自定义的BroadcastReceiver,负责监听从Service传回来的广播
    public class ActivityReceiver extends BroadcastReceiver
    {
        @Override
        public void onReceive(Context context, Intent intent)
        {
            // 获取Intent中的update消息,update代表播放状态
            int update = intent.getIntExtra("update", -1);
            // 获取Intent中的current消息,current代表当前正在播放的歌曲
            int current = intent.getIntExtra("current", -1);
            if (current >= 0)
            {
                title.setText(titleStrs[current]);
                author.setText(authorStrs[current]);
            }
            switch (update)
            {
                case 0x11:
                    play.setImageResource(R.drawable.play);
                    status = 0x11;
                    break;
                // 控制系统进入播放状态
                case 0x12:
                    // 播放状态下设置使用暂停图标
                    play.setImageResource(R.drawable.pause);
                    // 设置当前状态
                    status = 0x12;
                    break;
                // 控制系统进入暂停状态
                case 0x13:
                    // 暂停状态下设置使用播放图标
                    play.setImageResource(R.drawable.play);
                    // 设置当前状态
                    status = 0x13;
                    break;
            }
        }
    }
  1. 点击事件
@Override
    public void onClick(View source)
    {
        // 创建Intent
        Intent intent = new Intent("org.crazyit.action.CTL_ACTION");
        switch (source.getId())
        {
            // 按下播放/暂停按钮
            case R.id.play:
                intent.putExtra("control", 1);
                break;
            // 按下停止按钮
            case R.id.stop:
                intent.putExtra("control", 2);
                break;
            // 按下上一首按钮
            case R.id.last:
                intent.putExtra("control",3);
                break;
            // 按下下一首按钮
            case  R.id.next:
                intent.putExtra("control",4);
                break;
        }
        // 发送广播,将被Service组件中的BroadcastReceiver接收到
        sendBroadcast(intent);
    }
}
  1. 按钮点击事件
public void onClick(View v){//点击响应
        resetimg();
        switch (v.getId()){
            case R.id.id_tab_weixin:
                selectfragment(0);
                break;
            case R.id.id_tab_friend:
                selectfragment(1);
                break;
            case R.id.id_tab_contact:
                selectfragment(2);
                break;
            case R.id.id_tab_settings:
                selectfragment(3);
                break;
            default:
                break;
        }
}
  1. 列表循环播放
 // 创建MediaPlayer
        mPlayer = new MediaPlayer();
// 为MediaPlayer播放完成事件绑定监听器,列表循环播放
        mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener()
        {
            @Override
            public void onCompletion(MediaPlayer mp)
            {
                current++;
                if (current >= 3)
                {
                    current = 0;
                }
                //发送广播通知Activity更改文本框
                Intent sendIntent = new Intent(MainActivity.UPDATE_ACTION);
                sendIntent.putExtra("current", current);
                // 发送广播,将被Activity组件中的BroadcastReceiver接收到
                sendBroadcast(sendIntent);
                // 准备并播放音乐
                prepareAndPlay(musics[current]);
            }
        });
  1. MyReceiver播放控制
public class MyReceiver extends BroadcastReceiver
    {
        @Override
        public void onReceive(final Context context, Intent intent)
        {
            int control = intent.getIntExtra("control",-1);
            switch (control)
            {
                // 播放或暂停
                case 1:
                    // 原来处于没有播放状态
                    if (status == 0x11)
                    {
                        // 准备并播放音乐
                        prepareAndPlay(musics[current]);
                        status = 0x12;
                    }
                    // 原来处于播放状态
                    else if (status == 0x12)
                    {
                        // 暂停
                        mPlayer.pause();
                        // 改变为暂停状态
                        status = 0x13;
                    }
                    // 原来处于暂停状态
                    else if (status == 0x13)
                    {
                        // 播放
                        mPlayer.start();
                        // 改变状态
                        status = 0x12;
                    }
                    break;
                // 停止声音
                case 2:
                    // 如果原来正在播放或暂停
                    if (status == 0x12 || status == 0x13)
                    {
                        // 停止播放
                        mPlayer.stop();
                        status = 0x11;
                    }
                    break;
                //上一曲
                case 3:
                    current--;
                    if (current < 0)
                    {
                        current = 2;
                    }
                    // 准备并播放音乐
                    prepareAndPlay(musics[current]);
                    break;
                //下一曲
                case 4:
                    current++;
                    if (current >= 3)
                    {
                        current = 0;
                    }
                    // 准备并播放音乐
                    prepareAndPlay(musics[current]);
                    break;
            }
            // 广播通知Activity更改图标、文本框
            Intent sendIntent = new Intent(MainActivity.UPDATE_ACTION);
            sendIntent.putExtra("update", status);
            sendIntent.putExtra("current", current);
            // 发送广播,将被Activity组件中的BroadcastReceiver接收到
            sendBroadcast(sendIntent);
        }
    }

附上项目链接🎈

项目总结✔

本次项目是在一个已有的项目基础上增加上一首/下一首的控制功能,修改了部分布局,总体上遇到的问题不多,大致只是在xml文件中做了比较大的修改,assets文件夹中音乐文件做了修改,增加了上一首/下一首的控制。

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值