Android:MediaPlayer
MediaPlayer生命周期:
注:1.prepare会造成阻塞 要先缓存一段后才会播放
2.调用stop()方法后,在调用star()会出现状态错误。可用以下方法替代解决:
|
1
2
3
4
5
6
7
8
9
10
11
|
// 停止播放
private
void
stop()
{
// mPlayer.stop();
// 用下面的方法替代stop方法
mPlayer.pause();
mPlayer.seekTo(
0
);
sendPlayBroadcast();
}
|
范例:
|
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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
|
public
class
MediaPlayerServeice
extends
Service
{
private
MediaPlayer mPlayer;
private
SongJson songJson;
private
ArrayList<SongJson> mPlayList =
new
ArrayList<SongJson>();
//播放列表
private
ArrayList<SongJson> mRadomPlayList =
new
ArrayList<SongJson>();
//随机播放列表
private
int
mPlayMode;
//播放模式
private
SongJson mPlayingSong;
//当前播放歌曲
private
int
mSongPosition;
//当前播放歌曲在列表中的位置
public
MediaPlayerServeice()
{
}
@Override
public
void
onCreate()
{
super
.onCreate();
mPlayingSong =
new
SongJson();
mPlayer =
new
MediaPlayer();
mBinder =
new
PlayBinder();
//出现状态错误时,此方法规避fc
mPlayer.setOnErrorListener(
new
OnErrorListener()
{
@Override
public
boolean
onError(MediaPlayer mp,
int
what,
int
extra)
{
mPlayer.reset();
return
false
;
}
});
//监听音乐是否播放完毕
mPlayer.setOnCompletionListener(
new
OnCompletionListener()
{
@Override
public
void
onCompletion(MediaPlayer mp)
{
playNext();
}
});
}
private
IBinder mBinder;
@Override
public
IBinder onBind(Intent intent)
{
return
mBinder;
}
//快进快退
private
void
seekTo(
int
msec)
{
// mPlayer.getDuration();//得到歌曲总时间
mPlayer.seekTo(msec);
}
//得到当前播放位置
public
int
getCurrentPosition()
{
return
mPlayer.getCurrentPosition();
}
//播放下一首
private
void
playNext()
{
}
//停止播放
private
void
stop()
{
mPlayer.stop();
}
//得到播放循环模式
private
int
setPlayMode(
int
mode)
{
return
mPlayMode = mode;
}
//添加歌曲至播放列表
private
void
setPlayList(ArrayList<SongJson> list)
{
}
// 得到当前播放进度
private
int
getCurrTime()
{
return
mPlayer.getCurrentPosition();
}
//继续播放
private
void
continuePlay()
{
mPlayer.start();
}
//是否正在播放
private
boolean
isplaying()
{
return
mPlayer.isPlaying();
}
//暂停
private
void
pause()
{
mPlayer.pause();
}
// 播放音乐
private
void
play(
final
String url)
{
mPlayer.reset();
try
{
mPlayer.setDataSource(url);
mPlayer.setOnPreparedListener(
new
OnPreparedListener()
{
@Override
public
void
onPrepared(MediaPlayer mp)
{
mPlayer.start();
}
});
mPlayer.prepareAsync();
}
catch
(IllegalArgumentException e)
{
e.printStackTrace();
}
catch
(SecurityException e)
{
e.printStackTrace();
}
catch
(IllegalStateException e)
{
e.printStackTrace();
}
catch
(IOException e)
{
e.printStackTrace();
}
}
// 自定义Binder
public
class
PlayBinder
extends
Binder
{
public
void
play(String url)
{
MediaPlayerServeice.
this
.play(url);
}
public
boolean
isplaying()
{
return
MediaPlayerServeice.
this
.isplaying();
}
public
void
pause()
{
MediaPlayerServeice.
this
.pause();
}
public
void
continuePlay()
{
MediaPlayerServeice.
this
.continuePlay();
}
public
int
getCurrTime()
{
return
MediaPlayerServeice.
this
.getCurrTime();
}
public
void
setPlayList(ArrayList<SongJson> list)
{
MediaPlayerServeice.
this
.setPlayList(list);
}
public
int
setPlayMode(
int
mode)
{
return
MediaPlayerServeice.
this
.setPlayMode(mode);
}
public
void
playNext()
{
MediaPlayerServeice.
this
.playNext();
}
public
void
stop()
{
MediaPlayerServeice.
this
.stop();
}
public
int
getCurrentPosition()
{
return
MediaPlayerServeice.
this
.getCurrentPosition();
}
}
}
|
