首页 > 系统 > Android > 正文

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

2019-10-24 20:34:44
字体:大 中 小
来源:转载
供稿:网友

这篇文章主要教大家轻松制作Android音乐播放器,制作一款属于自己的Android音乐播放器,希望大家喜欢。

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

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

如果是只用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进行界面交互

 

 
  1. public class MusicService extends Service{ 
  2.  
  3. private List<File> musicList; 
  4. private MediaPlayer player; 
  5. private int curPage; 
  6. public static final String MFILTER = "broadcast.intent.action.text"; 
  7. public static final String NAME = "name"; 
  8. public static final String TOTALTIME = "totaltime"; 
  9. public static final String CURTIME = "curtime"; 
  10.  
  11. @Override 
  12. public IBinder onBind(Intent intent) {//1 
  13. // TODO Auto-generated method stub 
  14. return new MBinder(); 
  15. } 
  16. public class MBinder extends Binder{//2 
  17. public MusicService getService(){ 
  18. return MusicService.this; 
  19. }  
  20. public MediaPlayer getPlayer(){ 
  21. return player; 
  22. } 
  23. } 
  24. @Override 
  25. public void onCreate() { 
  26. // TODO Auto-generated method stub 
  27. super.onCreate(); 
  28. musicList = new ArrayList<File>(); 
  29. File rootDir = Environment.getExternalStorageDirectory();//3 
  30. Log.d("rootname",rootDir.getName()); 
  31. Log.d("rootname",rootDir.getAbsolutePath()); 
  32. fillMusicList(rootDir); 
  33. Log.d("musiclist",String.valueOf(musicList.size())); 
  34. player = new MediaPlayer(); 
  35. if (musicList.size() != 0) { 
  36. startPlay(); 
  37. } 
  38.  
  39. player.setOnCompletionListener(new OnCompletionListener() { 
  40.  
  41. @Override 
  42. public void onCompletion(MediaPlayer mp) { 
  43. // TODO Auto-generated method stub 
  44. player.reset(); 
  45. curPage = curPage==musicList.size()-1? (curPage+1)%musicList.size() : curPage+1;  
  46. startPlay(); 
  47. } 
  48. }); 
  49. } 
  50. /*迭代获取 音乐 文件*/ 
  51. private void fillMusicList(File dir){ 
  52. File[] sourceFiles = dir.listFiles(); 
  53. Log.d("长度",String.valueOf(sourceFiles.length)); 
  54. for(File file : sourceFiles){ 
  55. if (file.isDirectory()) { 
  56. Log.d("文件夹名称",String.valueOf(file.getName())); 
  57. // if (!file.getName().equals("lost+found")) { 
  58. fillMusicList(file); 
  59. // } 
  60.  
  61. } 
  62. else { 
  63. String name = file.getName(); 
  64. Log.d("childname",file.getName()); 
  65. if (name.endsWith(".mp3")||name.endsWith(".acc")) {//支持的格式 
  66. musicList.add(file); 
  67. } 
  68. } 
  69. } 
  70. } 
  71. private void startPlay(){ 
  72. mSendBroadCast(NAME,musicList.get(curPage).getName());//4 
  73. try { 
  74. player.setDataSource(musicList.get(curPage).getAbsolutePath()); 
  75. player.prepare(); 
  76. player.start(); 
  77. player.getDuration(); 
  78. mSendBroadCast(TOTALTIME,player.getDuration()); 
  79. Timer timer = new Timer(); 
  80. timer.schedule(new TimerTask() { 
  81.  
  82. @Override 
  83. public void run() { 
  84. // TODO Auto-generated method stub 
  85. mSendBroadCast(CURTIME,player.getCurrentPosition()); 
  86. } 
  87. },0,1000); 
  88.  
  89. } catch (IllegalArgumentException e) { 
  90. // TODO Auto-generated catch block 
  91. e.printStackTrace(); 
  92. } catch (SecurityException e) { 
  93. // TODO Auto-generated catch block 
  94. e.printStackTrace(); 
  95. } catch (IllegalStateException e) { 
  96. // TODO Auto-generated catch block 
  97. e.printStackTrace(); 
  98. } catch (IOException e) { 
  99. // TODO Auto-generated catch block 
  100. e.printStackTrace(); 
  101. } 
  102. } 
  103.  
  104.  
  105. public void playNext(){ 
  106. curPage = curPage==musicList.size()-1? (curPage+1)%musicList.size() : curPage+1;  
  107. Log.d("curpage",String.valueOf(curPage)); 
  108. player.reset(); 
  109. startPlay(); 
  110. } 
  111. public void playPrevious(){ 
  112. curPage = curPage==0? 0 : curPage-1;  
  113. Log.d("curpage",String.valueOf(curPage)); 
  114. player.reset(); 
  115. startPlay(); 
  116. } 
  117. public void parse(){ 
  118. player.pause(); 
  119. } 
  120. public void restart(){ 
  121. player.start(); 
  122. } 
  123. private void mSendBroadCast(String key, String value){ 
  124. Intent intent = new Intent(MFILTER); 
  125. intent.putExtra(key,value);//发送广播 
  126. sendBroadcast(intent); 
  127. } 
  128.  
  129. private void mSendBroadCast(String key, int value){ 
  130. Intent intent = new Intent(MFILTER); 
  131. intent.putExtra(key,value);//发送广播 
  132. sendBroadcast(intent); 
  133. } 
  134. } 

接下来上activity代码:

1、通过Ibinder对象获取服务对象

2、获取到服务对象以后,再访问服务的方法。

3、通过receiver刷新页面

 

 
  1. public class MainActivity extends Activity implements OnClickListener{ 
  2.  
  3. SeekBar seekBar; 
  4. TextView curTime,totalTime; 
  5. TextView title; 
  6.  
  7. private ServiceConnection sc; 
  8. private MusicService ms; 
  9. private boolean isStop; 
  10. private double totalTimeInt;  
  11. @Override 
  12. protected void onCreate(Bundle savedInstanceState) { 
  13. super.onCreate(savedInstanceState); 
  14. setContentView(R.layout.activity_main); 
  15. IntentFilter filter = new IntentFilter(MusicService.MFILTER); 
  16. registerReceiver(new MusicReceiver(),filter); 
  17. sc = new ServiceConnection() { 
  18.  
  19. @Override 
  20. public void onServiceDisconnected(ComponentName name) { 
  21. // TODO Auto-generated method stub 
  22. ms = null; 
  23. } 
  24.  
  25. @Override 
  26. public void onServiceConnected(ComponentName name, IBinder service) { 
  27. // TODO Auto-generated method stub 
  28. ms = ((MBinder)service).getService();//1 
  29.  
  30. } 
  31. }; 
  32. Button previous = (Button) findViewById(R.id.previous); 
  33. Button next = (Button) findViewById(R.id.next); 
  34. Button stop = (Button) findViewById(R.id.stop); 
  35. Button stopService = (Button) findViewById(R.id.stopService); 
  36. seekBar = (SeekBar) findViewById(R.id.mSeekbar); 
  37. curTime = (TextView) findViewById(R.id.curTime); 
  38. totalTime = (TextView) findViewById(R.id.totalTime); 
  39. title = (TextView) findViewById(R.id.title); 
  40.  
  41. previous.setOnClickListener(this); 
  42. next.setOnClickListener(this); 
  43. stop.setOnClickListener(this); 
  44. stopService.setOnClickListener(this); 
  45. } 
  46.  
  47. @Override 
  48. public void onClick(View v) { 
  49. // TODO Auto-generated method stub 
  50. switch (v.getId()) { 
  51. case R.id.previous: 
  52. ms.playPrevious();//2 
  53. break; 
  54. case R.id.next: 
  55. ms.playNext(); 
  56. break; 
  57. case R.id.stop: 
  58. if (isStop) { 
  59. ms.restart(); 
  60. } 
  61. else { 
  62. ms.parse(); 
  63. } 
  64. isStop = !isStop; 
  65. break; 
  66. case R.id.stopService: 
  67. Intent intent = new Intent("com.intent.musicplayer.MusicService"); 
  68. unbindService(sc); 
  69. stopService(intent); 
  70.  
  71. break; 
  72. default: 
  73. break; 
  74. } 
  75. } 
  76.  
  77. @Override 
  78. protected void onStart() { 
  79. // TODO Auto-generated method stub 
  80. super.onStart(); 
  81. Intent intent = new Intent("com.intent.musicplayer.MusicService"); 
  82. bindService(intent,sc,Context.BIND_AUTO_CREATE);//当然你可以用startService的方式启动服务,这样结束了activity以后并不会结束service 
  83.  
  84. } 
  85. private String transferMilliToTime(int millis){ 
  86. DateFormat format = new SimpleDateFormat("mm:ss"); 
  87. String result = format.format(new Date(millis)); 
  88. return result; 
  89. } 
  90. private class MusicReceiver extends BroadcastReceiver{//3 
  91.  
  92. @Override 
  93. public void onReceive(Context context, Intent intent) { 
  94. // TODO Auto-generated method stub 
  95. if (intent.getIntExtra(MusicService.CURTIME,0)!=0) { 
  96. double curTimeInt = intent.getIntExtra(MusicService.CURTIME,0); 
  97. curTime.setText(transferMilliToTime((int)curTimeInt)); 
  98. double result = curTimeInt/totalTimeInt*100; 
  99. seekBar.setProgress((int) Math.floor(result)); 
  100.  
  101. } 
  102. else if(intent.getIntExtra(MusicService.TOTALTIME,0)!=0) { 
  103. totalTimeInt = intent.getIntExtra(MusicService.TOTALTIME,0); 
  104. totalTime.setText(transferMilliToTime((int)(totalTimeInt))); 
  105. } 
  106. else if (!TextUtils.isEmpty(intent.getStringExtra(MusicService.NAME))) { 
  107. title.setText(intent.getStringExtra(MusicService.NAME)); 
  108. } 
  109. } 
  110.  
  111. } 
  112. } 

4、最后附上xml布局文件,算是代码上传完全了:

 

 
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  2. xmlns:tools="http://schemas.android.com/tools" 
  3. android:layout_width="match_parent" 
  4. android:layout_height="match_parent" 
  5. android:orientation="vertical" 
  6. tools:context="${relativePackage}.${activityClass}" > 
  7. <TextView  
  8. android:id="@+id/title" 
  9. android:layout_width="wrap_content" 
  10. android:layout_height="wrap_content" 
  11. android:layout_gravity="center_horizontal" 
  12. android:textSize="25sp" 
  13. android:textColor="#444444" 
  14. /> 
  15. <SeekBar  
  16. android:id="@+id/mSeekbar" 
  17. android:layout_gravity="center_horizontal" 
  18. android:layout_width="400dp" 
  19. android:layout_height="wrap_content" 
  20. android:max="100" 
  21. /> 
  22. <RelativeLayout  
  23. android:layout_width="match_parent" 
  24. android:layout_height="wrap_content" 
  25. > 
  26. <TextView 
  27. android:id="@+id/curTime" 
  28. android:layout_height="wrap_content" 
  29. android:layout_width="wrap_content" 
  30. android:layout_alignParentLeft="true" 
  31.  
  32. /> 
  33. <TextView 
  34. android:id="@+id/totalTime" 
  35. android:layout_height="wrap_content" 
  36. android:layout_width="wrap_content" 
  37. android:layout_alignParentRight="true" 
  38. /> 
  39. </RelativeLayout> 
  40. <RelativeLayout  
  41. android:layout_width="match_parent" 
  42. android:layout_height="wrap_content" 
  43. > 
  44. <Button 
  45. android:id="@+id/previous" 
  46. android:layout_height="wrap_content" 
  47. android:layout_width="wrap_content" 
  48. android:text="上一曲" 
  49. android:layout_alignParentLeft="true" 
  50. /> 
  51. <Button  
  52. android:id="@+id/stop" 
  53. android:layout_height="wrap_content" 
  54. android:layout_width="wrap_content" 
  55. android:text="停止音乐" 
  56. android:layout_toRightOf="@id/previous" 
  57. /> 
  58.  
  59. <Button 
  60. android:id="@+id/next" 
  61. android:layout_height="wrap_content" 
  62. android:layout_width="wrap_content" 
  63. android:text="下一曲" 
  64. android:layout_alignParentRight="true" 
  65. /> 
  66. <Button  
  67. android:id="@+id/stopService" 
  68. android:layout_height="wrap_content" 
  69. android:layout_width="wrap_content" 
  70. android:text="停止音乐服务" 
  71. android:layout_toLeftOf="@id/next" 
  72. /> 
  73. </RelativeLayout>  
  74.  
  75. </LinearLayout> 

以上就是制作Android音乐播放器的全部代码,希望对大家的学习有所帮助。


注:相关教程知识阅读请移步到Android开发频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表