服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Android - 教你轻松制作Android音乐播放器

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

2021-04-12 10:31Android开发网 Android

这篇文章主要教大家轻松制作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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
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刷新页面

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
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布局文件,算是代码上传完全了:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
<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>

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

延伸 · 阅读

精彩推荐
  • AndroidAndroid中AsyncTask详细介绍

    Android中AsyncTask详细介绍

    这篇文章主要介绍了Android中AsyncTask详细介绍,AsyncTask是一个很常用的API,尤其异步处理数据并将数据应用到视图的操作场合,需要的朋友可以参考下...

    Android开发网7452021-03-11
  • AndroidAndroid CardView+ViewPager实现ViewPager翻页动画的方法

    Android CardView+ViewPager实现ViewPager翻页动画的方法

    本篇文章主要介绍了Android CardView+ViewPager实现ViewPager翻页动画的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    Abby代黎明9602022-03-02
  • AndroidAndroid程序设计之AIDL实例详解

    Android程序设计之AIDL实例详解

    这篇文章主要介绍了Android程序设计的AIDL,以一个完整实例的形式较为详细的讲述了AIDL的原理及实现方法,需要的朋友可以参考下...

    Android开发网4642021-03-09
  • AndroidAndroid实现固定屏幕显示的方法

    Android实现固定屏幕显示的方法

    这篇文章主要介绍了Android实现固定屏幕显示的方法,实例分析了Android屏幕固定显示所涉及的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    鉴客6192021-03-27
  • AndroidAndroid实现Service获取当前位置(GPS+基站)的方法

    Android实现Service获取当前位置(GPS+基站)的方法

    这篇文章主要介绍了Android实现Service获取当前位置(GPS+基站)的方法,较为详细的分析了Service基于GPS位置的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    Ruthless8342021-03-31
  • AndroidAndroid界面效果UI开发资料汇总(附资料包)

    Android界面效果UI开发资料汇总(附资料包)

    android ui界面设计,友好的界面会提高用户体验度;同时也增强了android ui界面设计的难度,本文提供了一些常用开发资料(有下载哦)感兴趣的朋友可以了解下...

    Android开发网4672021-01-03
  • Android汇总Android视频录制中常见问题

    汇总Android视频录制中常见问题

    这篇文章主要汇总了Android视频录制中常见问题,帮助大家更好地解决Android视频录制中常见的问题,需要的朋友可以参考下...

    yh_thu5192021-04-28
  • AndroidAndroid编程解析XML方法详解(SAX,DOM与PULL)

    Android编程解析XML方法详解(SAX,DOM与PULL)

    这篇文章主要介绍了Android编程解析XML方法,结合实例形式详细分析了Android解析XML文件的常用方法与相关实现技巧,需要的朋友可以参考下...

    liuhe68810052021-05-03