教你轻松制作Android音乐播放器
程序员文章站
2023-12-02 19:33:16
欣赏一下我们清爽的界面吧~
如果是只用activity来制作这样的东西简直是太小儿科了,此处我们当然用的是service
首先我们先上service的代码:
1、...
欣赏一下我们清爽的界面吧~
如果是只用activity来制作这样的东西简直是太小儿科了,此处我们当然用的是service
首先我们先上service的代码:
1、如果我们要访问service的属性和方法,那么在activity肯定是以bindservice的方法实现的,而在service中的onbind方法也是必须要实现的,onbind返回的ibinder对象在activity的serviceconnection中得到使用。
2、activity获取到ibinder对象,可以进一步获取服务对象和player对象,来进行访问。
3、environment.getexternalstoragedirectory()是获取sd中的内容的,不管是手机出场就已经内置的sd卡,还是用户后来自己添加的sd卡;而getexternalfilesdir()获取的真正是手机内部的存储空间,,/data/data/your_package/,随着应用的卸载存储的文件会被删除。
4、service通过发送广播与activity进行界面交互
public class musicservice extends service{ private list<file> musiclist; private mediaplayer player; private int curpage; public static final string mfilter = "broadcast.intent.action.text"; public static final string name = "name"; public static final string totaltime = "totaltime"; public static final string curtime = "curtime"; @override public ibinder onbind(intent intent) {//1 // todo auto-generated method stub return new mbinder(); } public class mbinder extends binder{//2 public musicservice getservice(){ return musicservice.this; } public mediaplayer getplayer(){ return player; } } @override public void oncreate() { // todo auto-generated method stub super.oncreate(); musiclist = new arraylist<file>(); file rootdir = environment.getexternalstoragedirectory();//3 log.d("rootname",rootdir.getname()); log.d("rootname",rootdir.getabsolutepath()); fillmusiclist(rootdir); log.d("musiclist",string.valueof(musiclist.size())); player = new mediaplayer(); if (musiclist.size() != 0) { startplay(); } player.setoncompletionlistener(new oncompletionlistener() { @override public void oncompletion(mediaplayer mp) { // todo auto-generated method stub player.reset(); curpage = curpage==musiclist.size()-1? (curpage+1)%musiclist.size() : curpage+1; startplay(); } }); } /*迭代获取 音乐 文件*/ private void fillmusiclist(file dir){ file[] sourcefiles = dir.listfiles(); log.d("长度",string.valueof(sourcefiles.length)); for(file file : sourcefiles){ if (file.isdirectory()) { log.d("文件夹名称",string.valueof(file.getname())); // if (!file.getname().equals("lost+found")) { fillmusiclist(file); // } } else { string name = file.getname(); log.d("childname",file.getname()); if (name.endswith(".mp3")||name.endswith(".acc")) {//支持的格式 musiclist.add(file); } } } } private void startplay(){ msendbroadcast(name,musiclist.get(curpage).getname());//4 try { player.setdatasource(musiclist.get(curpage).getabsolutepath()); player.prepare(); player.start(); player.getduration(); msendbroadcast(totaltime,player.getduration()); timer timer = new timer(); timer.schedule(new timertask() { @override public void run() { // todo auto-generated method stub msendbroadcast(curtime,player.getcurrentposition()); } },0,1000); } catch (illegalargumentexception e) { // todo auto-generated catch block e.printstacktrace(); } catch (securityexception e) { // todo auto-generated catch block e.printstacktrace(); } catch (illegalstateexception e) { // todo auto-generated catch block e.printstacktrace(); } catch (ioexception e) { // todo auto-generated catch block e.printstacktrace(); } } public void playnext(){ curpage = curpage==musiclist.size()-1? (curpage+1)%musiclist.size() : curpage+1; log.d("curpage",string.valueof(curpage)); player.reset(); startplay(); } public void playprevious(){ curpage = curpage==0? 0 : curpage-1; log.d("curpage",string.valueof(curpage)); player.reset(); startplay(); } public void parse(){ player.pause(); } public void restart(){ player.start(); } private void msendbroadcast(string key, string value){ intent intent = new intent(mfilter); intent.putextra(key,value);//发送广播 sendbroadcast(intent); } private void msendbroadcast(string key, int value){ intent intent = new intent(mfilter); intent.putextra(key,value);//发送广播 sendbroadcast(intent); } }
接下来上activity代码:
1、通过ibinder对象获取服务对象
2、获取到服务对象以后,再访问服务的方法。
3、通过receiver刷新页面
public class mainactivity extends activity implements onclicklistener{ seekbar seekbar; textview curtime,totaltime; textview title; private serviceconnection sc; private musicservice ms; private boolean isstop; private double totaltimeint; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); intentfilter filter = new intentfilter(musicservice.mfilter); registerreceiver(new musicreceiver(),filter); sc = new serviceconnection() { @override public void onservicedisconnected(componentname name) { // todo auto-generated method stub ms = null; } @override public void onserviceconnected(componentname name, ibinder service) { // todo auto-generated method stub ms = ((mbinder)service).getservice();//1 } }; button previous = (button) findviewbyid(r.id.previous); button next = (button) findviewbyid(r.id.next); button stop = (button) findviewbyid(r.id.stop); button stopservice = (button) findviewbyid(r.id.stopservice); seekbar = (seekbar) findviewbyid(r.id.mseekbar); curtime = (textview) findviewbyid(r.id.curtime); totaltime = (textview) findviewbyid(r.id.totaltime); title = (textview) findviewbyid(r.id.title); previous.setonclicklistener(this); next.setonclicklistener(this); stop.setonclicklistener(this); stopservice.setonclicklistener(this); } @override public void onclick(view v) { // todo auto-generated method stub switch (v.getid()) { case r.id.previous: ms.playprevious();//2 break; case r.id.next: ms.playnext(); break; case r.id.stop: if (isstop) { ms.restart(); } else { ms.parse(); } isstop = !isstop; break; case r.id.stopservice: intent intent = new intent("com.intent.musicplayer.musicservice"); unbindservice(sc); stopservice(intent); break; default: break; } } @override protected void onstart() { // todo auto-generated method stub super.onstart(); intent intent = new intent("com.intent.musicplayer.musicservice"); bindservice(intent,sc,context.bind_auto_create);//当然你可以用startservice的方式启动服务,这样结束了activity以后并不会结束service } private string transfermillitotime(int millis){ dateformat format = new simpledateformat("mm:ss"); string result = format.format(new date(millis)); return result; } private class musicreceiver extends broadcastreceiver{//3 @override public void onreceive(context context, intent intent) { // todo auto-generated method stub if (intent.getintextra(musicservice.curtime,0)!=0) { double curtimeint = intent.getintextra(musicservice.curtime,0); curtime.settext(transfermillitotime((int)curtimeint)); double result = curtimeint/totaltimeint*100; seekbar.setprogress((int) math.floor(result)); } else if(intent.getintextra(musicservice.totaltime,0)!=0) { totaltimeint = intent.getintextra(musicservice.totaltime,0); totaltime.settext(transfermillitotime((int)(totaltimeint))); } else if (!textutils.isempty(intent.getstringextra(musicservice.name))) { title.settext(intent.getstringextra(musicservice.name)); } } } }
4、最后附上xml布局文件,算是代码上传完全了:
<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="${relativepackage}.${activityclass}" > <textview android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:textsize="25sp" android:textcolor="#444444" /> <seekbar android:id="@+id/mseekbar" android:layout_gravity="center_horizontal" android:layout_width="400dp" android:layout_height="wrap_content" android:max="100" /> <relativelayout android:layout_width="match_parent" android:layout_height="wrap_content" > <textview android:id="@+id/curtime" android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_alignparentleft="true" /> <textview android:id="@+id/totaltime" android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_alignparentright="true" /> </relativelayout> <relativelayout android:layout_width="match_parent" android:layout_height="wrap_content" > <button android:id="@+id/previous" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="上一曲" android:layout_alignparentleft="true" /> <button android:id="@+id/stop" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="停止音乐" android:layout_torightof="@id/previous" /> <button android:id="@+id/next" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="下一曲" android:layout_alignparentright="true" /> <button android:id="@+id/stopservice" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="停止音乐服务" android:layout_toleftof="@id/next" /> </relativelayout> </linearlayout>
更多关于播放器的内容请点击《java播放器功能》进行学习。
以上就是制作android音乐播放器的全部代码,希望对大家的学习有所帮助。