Android 监听系统音乐播放器播放的音乐的方法

来源:互联网 发布:c语言缺陷与陷阱怎么样 编辑:程序博客网 时间:2024/04/28 17:44

转自:http://www.cnblogs.com/xinye/archive/2012/06/06/music_info.html

最近在做项目的时候遇到一个小问题,就是需要自己写一个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
    publicvoid 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
    protectedvoid 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
    protectedvoid 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";
    privatestatic final String CMDNAME = "command";
/*    private static final String CMDTOGGLEPAUSE = "togglepause";
    private static final String CMDSTOP = "stop";*/
    privatestatic final String CMDPAUSE = "pause";
    privatestatic final String CMDPLAY = "play";
    privatestatic final String CMDPREVIOUS = "previous";
    privatestatic final String CMDNEXT = "next";
     
    publicvoid click(View v){
        Intent intent =new Intent(SERVICECMD);
        switch(v.getId()){
            caseR.id.pre:{
                intent.putExtra(CMDNAME, CMDPREVIOUS);
            }break;
            caseR.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;
            caseR.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";
    privatestatic final String CMDNAME = "command";
/*    private static final String CMDTOGGLEPAUSE = "togglepause";
    private static final String CMDSTOP = "stop";*/
    privatestatic final String CMDPAUSE = "pause";
    privatestatic final String CMDPLAY = "play";
    privatestatic final String CMDPREVIOUS = "previous";
    privatestatic final String CMDNEXT = "next";
 
 
替换为
 
privatestatic final String pause = "com.android.music.musicservicecommand.pause";
privatestatic final String next = "com.android.music.musicservicecommand.next";
privatestatic final String stop = "com.android.music.musicservicecommand.stop";
privatestatic final String previous = "com.android.music.musicservicecommand.previous";

  然后new Intent(pause/next/stop/previous);等通过sendBroadcast(intent);发送也可以,但是我没有亲自验证过,大家可以试一下,第一种是验证过的。

  贴出原理图:下面是我做锁屏的时候的图,左边的部分是锁屏相关的,不要受它影响。

  

0 0
原创粉丝点击