这里要完成音乐播放,我们需要使用到Broadcast实现模式,也就是我们所说的广播
先展示一下项目成品哈:

首先是布局文件:
(这里的布局我是直接采用的酷狗的音乐盒布局)
layout/activity_main.xml

<?xml version="1.0" encoding="utf-8"?>                                                                            

在编写main之前,我们不妨先将music类写好
MusicService.java

package com.example.mymusicbox;import android.app.Service;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.content.res.AssetFileDescriptor;import android.content.res.AssetManager;import android.media.MediaPlayer;import android.media.MediaPlayer.OnCompletionListener;import android.os.IBinder;import java.io.IOException;public class MusicService extends Service{    MyReceiver serviceReceiver;    AssetManager am;    String[] musics = new String[] { "composer.mp3" +            "", "bridge.mp3",            "graininear.mp3" };    MediaPlayer mPlayer;    // 当前的状态,0x11代表没有播放;0x12代表正在播放;0x13代表暂停    int status = 0x11;    // 记录当前正在播放的音乐    int current = 0;    @Override    public IBinder onBind(Intent intent)    {        return null;    }    @Override    public void onCreate()    {        super.onCreate();        am = getAssets();        // 创建BroadcastReceiver        serviceReceiver = new MyReceiver();        // 创建IntentFilter        IntentFilter filter = new IntentFilter();        filter.addAction(MainActivity.CTL_ACTION);        registerReceiver(serviceReceiver, filter);        // 创建MediaPlayer        mPlayer = new MediaPlayer();        // 为MediaPlayer播放完成事件绑定监听器        mPlayer.setOnCompletionListener(new 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]);            }        });    }    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;                    }                case 3:                    current--;                    if(current < 0)                        current = 0;                    prepareAndPlay(musics[current]);                case 4:                    current++;                    if(current > musics.length-1)                        current = 0;                    prepareAndPlay(musics[current]);            }            // 广播通知Activity更改图标、文本框            Intent sendIntent = new Intent(MainActivity.UPDATE_ACTION);            sendIntent.putExtra("update", status);            sendIntent.putExtra("current", current);            // 发送广播,将被Activity组件中的BroadcastReceiver接收到            sendBroadcast(sendIntent);        }    }    private void prepareAndPlay(String music)    {        try        {            // 打开指定音乐文件            AssetFileDescriptor afd = am.openFd(music);            mPlayer.reset();            // 使用MediaPlayer加载指定的声音文件。            mPlayer.setDataSource(afd.getFileDescriptor(),                    afd.getStartOffset(), afd.getLength());            // 准备声音            mPlayer.prepare();            // 播放            mPlayer.start();        }        catch (IOException e)        {            e.printStackTrace();        }    }}

想必大家这是已经报错了。。。不过不慌
随后我们进入项目的xml中更改一个serviece
AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>                                                                                                

诶 增加了service之后 舒服啦
最后就是我们的main.java啦
MainActivity.java

package com.example.mymusicbox;import android.support.v4.app.*;import android.os.Bundle;import android.app.Activity;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.ImageButton;import android.widget.ImageView;import android.widget.TextView;public class MainActivity extends Activity implements OnClickListener{    // 获取界面中显示歌曲标题、作者文本框    TextView title, author;    // 播放/暂停、停止按钮    ImageButton play, stop;    // 上一首,下一首按钮    ImageButton pre, next;    // 获取封面    ImageView cover;    ActivityReceiver activityReceiver;    public static final String CTL_ACTION =            "org.crazyit.action.CTL_ACTION";    public static final String UPDATE_ACTION =            "org.crazyit.action.UPDATE_ACTION";    // 定义音乐的播放状态,0x11代表没有播放;0x12代表正在播放;0x13代表暂停    int status = 0x11;    String[] titleStrs = new String[] { "作曲家", "木桥小谣", "芒种" };    String[] authorStrs = new String[] { "李荣浩", "王梓钰", "赵方婧" };    Integer[] covers = new Integer[] { R.drawable.composer, R.drawable.bridge, R.drawable.graininear};    @Override    public void onCreate(Bundle savedInstanceState)    {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        // 获取程序界面界面中的两个按钮        play = (ImageButton) this.findViewById(R.id.play);        stop = (ImageButton) this.findViewById(R.id.stop);        title = (TextView) findViewById(R.id.title);        author = (TextView) findViewById(R.id.author);        cover = findViewById(R.id.cover);        pre = this.findViewById(R.id.pre);        next = this.findViewById(R.id.next);        // 为两个按钮的单击事件添加监听器        play.setOnClickListener(this);        stop.setOnClickListener(this);        // 为上一首、下一首的单击事件添加监听器        pre.setOnClickListener(this);        next.setOnClickListener(this);        activityReceiver = new ActivityReceiver();        // 创建IntentFilter        IntentFilter filter = new IntentFilter();        // 指定BroadcastReceiver监听的Action        filter.addAction(UPDATE_ACTION);        // 注册BroadcastReceiver        registerReceiver(activityReceiver, filter);        Intent intent = new Intent(this, MusicService.class);        // 启动后台Service        startService(intent);    }    // 自定义的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]);                cover.setImageResource(covers[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;            }        }    }    @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.pre:                intent.putExtra("control",3);            case R.id.next:                intent.putExtra("control",4);        }        // 发送广播,将被Service组件中的BroadcastReceiver接收到        sendBroadcast(intent);    }}

好了 至此,我们也就成功完成了一个简单的音乐播放器。可以进行音乐的播放和上一首下一周的切换

最后是项目的源码:
码云源码

更多相关文章

  1. android Drawable资源
  2. android permiss manager (安全软件获取权限 禁用 可用 提示状态)
  3. Android锁屏状态下点亮屏幕并弹窗提醒
  4. DrawerLayout中侧边栏NavigationView沉浸式状态栏无效问题
  5. Android应用程序开发之requestWindowFeature()
  6. Android(安卓)状态栏的设置
  7. Android(安卓)7.0 Audio: 按键调节音量的调用过程
  8. Android(安卓)饺子播放器
  9. Android(安卓)livedata 源码解剖

随机推荐

  1. sqlserver中比较一个字符串中是否含含另
  2. SQLServer 中的死锁说明
  3. 清空数据库中所有表记录 记录ID恢复从0开
  4. sqlserver中向表中插入多行数据的insert
  5. sqlserver 聚集索引和非聚集索引实例
  6. ADO.NET EF中的实体修改方法
  7. sqlserver 函数、存储过程、游标与事务模
  8. SQL入侵恢复xp_cmdshell方法总结
  9. 世界杯猜想活动的各类榜单的SQL语句小结
  10. SQLServer 2000 数据库同步详细步骤[两台