最近在做项目的时候遇到一个小问题,就是需要自己写一个View来控制系统音乐播放器的播放行为,并且要能得到正在播放的音乐的信息,可能刚开始是想省点时间,所以就没有直接去看源码,而是上网搜索了一下,但令我十分惊讶的是网上竟然没有这个,难道说没有童鞋做过这个?嘿嘿,啥都不说了,开始:
获得系统正在播放的音乐的信息,查看源码可以知道,在Music应用中有一个MediaPlaybackService.java文件,内部的代码我就不写了,总之就是在播放音乐的时候会在四种情况下发送广播,这些广播里面包含了正在播放的音乐的信息,所以我们只要写一个广播来接受这些信息就可以了:
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
|
MusicBroadcastReceiver mbr =
null
;
//定义<br><br><br>class MusicBroadcastReceiver extends BroadcastReceiver {
@Override
public
void
onReceive(Context context, Intent intent) {
artistName = intent.getStringExtra(
"artist"
);
album = intent.getStringExtra(
"album"
);
track = intent.getStringExtra(
"track"
);
playing = intent.getBooleanExtra(
"playing"
,
false
);
duration = intent.getLongExtra(
"duration"
,
3000
);
position = intent.getLongExtra(
"position"
,
1000
);
Toast.makeText(TestActivity.
this
,
"playing:"
+ playing, Toast.LENGTH_SHORT).show();
if
(playing){
sd.setVisibility(View.VISIBLE);
}
else
{
if
((!sd.isOpened())){
sd.setVisibility(View.GONE);
}
}
if
(playing){
((ImageView)findViewById(R.id.play)).setImageResource(R.drawable.music_pause);
}
else
{
((ImageView)findViewById(R.id.play)).setImageResource(R.drawable.music_play);
}
((TextView)findViewById(R.id.musicName)).setText(track );
((TextView)findViewById(R.id.musicInfo)).setText(artistName +
" / "
+ album);
}
}
|
上面写的是一个广播界接收者,需要在适当的时机进行注册,由于MediaPlaybackService发送的是一个粘性广播,所以我们的这个接收者在应用打开的时候也可以接收到这个广播,不需要管上面我的那些个TextView或者是ImageView。
注册广播:
@Override
protected
void
onResume() {
/**
* com.android.music.metachanged
* com.android.music.queuechanged",
* "com.android.music.playbackcomplete"
* "com.android.music.playstatechanged"
*/
mbr =
new
MusicBroadcastReceiver();
IntentFilter intentFilter =
new
IntentFilter();
intentFilter.addAction(
"com.android.music.metachanged"
);
intentFilter.addAction(
"com.android.music.queuechanged"
);
intentFilter.addAction(
"com.android.music.playbackcomplete"
);
intentFilter.addAction(
"com.android.music.playstatechanged"
);
registerReceiver(mbr, intentFilter);
super
.onResume();
}
|
注销广播:
1
2
3
4
5
6
7
|
@Override
protected
void
onPause() {
if
(mbr !=
null
){
unregisterReceiver(mbr);
}
super
.onPause();
}
|
控制音乐的播放:
同样在Music应用中有一个MediaButtonIntentReceiver接受着,当我们我们可以发送特定的广播来控制音乐的播放,如下:
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
|
private
static
final
String SERVICECMD =
"com.android.music.musicservicecommand"
;
private
static
final
String CMDNAME =
"command"
;
/* private static final String CMDTOGGLEPAUSE = "togglepause";
private static final String CMDSTOP = "stop";*/
private
static
final
String CMDPAUSE =
"pause"
;
private
static
final
String CMDPLAY =
"play"
;
private
static
final
String CMDPREVIOUS =
"previous"
;
private
static
final
String CMDNEXT =
"next"
;
public
void
click(View v){
Intent intent =
new
Intent(SERVICECMD);
switch
(v.getId()){
case
R.id.pre:{
intent.putExtra(CMDNAME, CMDPREVIOUS);
}
break
;
case
R.id.play:{
if
(playing){
intent.putExtra(CMDNAME,CMDPAUSE);
((ImageView)findViewById(R.id.play)).setImageResource(R.drawable.music_play);
}
else
{
intent.putExtra(CMDNAME,CMDPLAY);
((ImageView)findViewById(R.id.play)).setImageResource(R.drawable.music_pause);
}
}
break
;
case
R.id.next:{
intent.putExtra(CMDNAME,CMDNEXT);
}
break
;
}
sendBroadcast(intent);
}
|
放送广播的时候也可以不给Inent设置Extra,只需要把:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
private
static
final
String SERVICECMD =
"com.android.music.musicservicecommand"
;
private
static
final
String CMDNAME =
"command"
;
/* private static final String CMDTOGGLEPAUSE = "togglepause";
private static final String CMDSTOP = "stop";*/
private
static
final
String CMDPAUSE =
"pause"
;
private
static
final
String CMDPLAY =
"play"
;
private
static
final
String CMDPREVIOUS =
"previous"
;
private
static
final
String CMDNEXT =
"next"
;
替换为
private
static
final
String pause =
"com.android.music.musicservicecommand.pause"
;
private
static
final
String next =
"com.android.music.musicservicecommand.next"
;
private
static
final
String stop =
"com.android.music.musicservicecommand.stop"
;
private
static
final
String previous =
"com.android.music.musicservicecommand.previous"
;
|
然后new Intent(pause/next/stop/previous);等通过sendBroadcast(intent);发送也可以,但是我没有亲自验证过,大家可以试一下,第一种是验证过的。
贴出原理图:下面是我做锁屏的时候的图,左边的部分是锁屏相关的,不要受它影响。