当前位置: 移动技术网 > 移动技术>移动开发>Android > 教你轻松制作Android音乐播放器

教你轻松制作Android音乐播放器

2019年07月24日  | 移动技术网移动技术  | 我要评论

欣赏一下我们清爽的界面吧~

如果是只用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音乐播放器的全部代码,希望对大家的学习有所帮助。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网