Android实现简易的音乐播放器
程序员文章站
2022-03-16 13:13:09
本文实例为大家分享了android实现简易的音乐播放器,供大家参考,具体内容如下功能介绍本次实验实现的是使用andriod studio开发一个简易的音乐播放器,所包含的功能有音乐的播放、暂停、上一曲...
本文实例为大家分享了android实现简易的音乐播放器,供大家参考,具体内容如下
功能介绍
本次实验实现的是使用andriod studio开发一个简易的音乐播放器,所包含的功能有音乐的播放、暂停、上一曲、下一曲、音乐播放的进度以及手动拖动来控制音乐的播放进度。
实现过程
导入项目所需的音乐文件、图标、背景等
1.创建一个raw文件夹,将音乐文件导入到这个文件夹中,方便我们在项目中使用
2.在drawable中导入所需的图片、图标
设计ui界面
1.设计5个button控件,分别对应上一曲,下一曲,暂停,播放,退出
2.设计3个textview,分别对应歌曲的介绍信息、歌曲的进度(歌曲的总时间和歌曲当前播放的时间)、歌曲的名字
service服务的编写
创建一个musicservice对象继承service
musicservice所需要的成员变量
myreceiver servicereceiver; thread processthread; assetmanager am;//是附件管理器,用于根据文件名找到文件所在并打开文件 string[] musics = new string[]{"legendsneverdie.mp3", "promise.mp3", "beautiful.mp3"};//默认显示的歌曲信息 mediaplayer mplayer; // 当前的状态,0x11代表没有播放;0x12代表正在播放;0x13代表暂停 int status = 0x11; // 记录当前正在播放的音乐 int current = 0;
实现循环播放
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) { log.d("musicservice", "播放完成"); current++; if (current >= 3) { current = 0; } // 准备并播放音乐 prepareandplay(musics[current]); //发送广播通知activity更改文本框 intent sendintent = new intent(mainactivity.update_action); sendintent.putextra("current", current); sendintent.putextra("currenttime", mplayer.getcurrentposition()); sendintent.putextra("totaltime", mplayer.getduration()); // 发送广播,将被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(); } }
实现刷新进度条
processthread = new thread(new runnable() { @override public void run() { while (true) { if (status == 0x12) { try { thread.sleep(1000); intent sendintent = new intent(mainactivity.update_action); sendintent.putextra("current", current); sendintent.putextra("currenttime", mplayer.getcurrentposition()); sendintent.putextra("totaltime", mplayer.getduration()); // 发送广播,将被activity组件中的broadcastreceiver接收到 sendbroadcast(sendintent); } catch (interruptedexception e) { e.printstacktrace(); } } } } }); processthread.start(); }
广播通信接收器的实现(用于实现和activity的通信)
public class myreceiver extends broadcastreceiver { @override public void onreceive(final context context, intent intent) { int control = intent.getintextra("control", -1); log.d("musicreceiver", "收到广播, control=" + control); 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(); if (current + 1 >= musics.length) { current = 0; } else { current++; } prepareandplay(musics[current]); status = 0x12; break; } // 上一首 case 3: if (status == 0x12 || status == 0x13) { mplayer.stop(); if (current - 1 < 0) { current = musics.length - 1; } else { current--; } prepareandplay(musics[current]); status = 0x12; } } // 广播通知activity更改图标、文本框 intent sendintent = new intent(mainactivity.update_action); sendintent.putextra("update", status); sendintent.putextra("current", current); // 发送广播,将被activity组件中的broadcastreceiver接收到 sendbroadcast(sendintent); } }
activity的实现
初始化和动态绑定接收器
// 获取界面中显示歌曲标题、作者文本框 textview title, author, currenttime, totaltime; // 播放/暂停、停止按钮 imagebutton play; imageview lastmusic, nextmusic; // 进度条 progressbar progressbar; activityreceiver activityreceiver; public static final string ctl_action = "org.xr.action.ctl_action"; public static final string update_action = "org.xr.action.update_action"; // 定义音乐的播放状态,0x11代表没有播放;0x12代表正在播放;0x13代表暂停 int status = 0x11; string[] titlestrs = new string[]{"legends never die", "约定", "美丽新世界"}; string[] authorstrs = new string[]{"英雄联盟", "周蕙", "伍佰"}; @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); // 获取程序界面界面中的两个按钮 play = (imagebutton) this.findviewbyid(r.id.play); lastmusic = this.findviewbyid(r.id.lastmusic); nextmusic = this.findviewbyid(r.id.nextmusic); title = (textview) findviewbyid(r.id.title); author = (textview) findviewbyid(r.id.author); currenttime = findviewbyid(r.id.currenttime); totaltime = findviewbyid(r.id.totaltime); progressbar = findviewbyid(r.id.progressbar); // 为两个按钮的单击事件添加监听器 play.setonclicklistener(this); lastmusic.setonclicklistener(this); nextmusic.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); }
设置activity的广播接收器(接收service发送过来的广播)
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); int totalposition = intent.getintextra("totaltime", -1); int currentposition = intent.getintextra("currenttime", -1); log.d("activityreceiver", "收到广播"); log.d("activityreceiver", "current:" + current + " totalposition:" + totalposition + " currentposition:" + currentposition + " update:" + update); if (current >= 0) { title.settext(titlestrs[current]); author.settext(authorstrs[current]); } if (totalposition >= 0) { simpledateformat simpledateformat = new simpledateformat("mm:ss", locale.china); date date = new date(totalposition); string formattime = simpledateformat.format(date); totaltime.settext(formattime); } if (currentposition >= 0) { double process = ((double)currentposition / totalposition)*100; log.d("activityreceiver", "当前进度:" + (double)currentposition/totalposition); simpledateformat simpledateformat = new simpledateformat("mm:ss", locale.china); date date = new date(currentposition); string formattime = simpledateformat.format(date); progressbar.setprogress((int) process); currenttime.settext(formattime); } 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; } }
实现图标的点击功能
// 创建intent intent intent = new intent("org.xr.action.ctl_action"); switch (source.getid()) { // 按下播放/暂停按钮 case r.id.play: intent.putextra("control", 1); break; case r.id.lastmusic: intent.putextra("control", 3); case r.id.nextmusic: intent.putextra("control", 2); } // 发送广播,将被service组件中的broadcastreceiver接收到 sendbroadcast(intent); }
结果展示
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。