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

转自: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
     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);发送也可以,但是我没有亲自验证过,大家可以试一下,第一种是验证过的。

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

  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android音乐播放器的实现可以分为以下步骤: 1. 获取音乐文件 首先,需要获取存储在设备上的音乐文件。可以使用Android的MediaStore类来访问设备上的媒体文件,包括音乐、视频和图片等。 2. 播放音乐 使用MediaPlayer类来播放音乐。MediaPlayer是Android提供的一个用于播放音频和视频的类,可以实现音乐播放、暂停、停止等功能。 3. 显示音乐列表 可以使用ListView或RecyclerView来显示音乐列表,其中每个列表项包含音乐文件的名称、歌手、专辑封面等信息。 4. 控制音乐播放音乐播放器界面上添加控制按钮,如播放、暂停、停止、上一曲、下一曲等按钮,通过点击按钮来控制音乐播放。 5. 实现后台播放 通过Service来实现音乐的后台播放,即使应用处于后台或者设备锁屏,音乐仍然可以继续播放。 6. 实现通知栏控制 在通知栏中添加音乐控制按钮,可以在不打开应用程序的情况下控制音乐播放和暂停等操作。 7. 实现循环播放、随机播放等功能 可以在播放器中添加循环播放、随机播放等功能,使用户可以根据自己的喜好来选择音乐播放模式。 8. 实现歌词显示 可以通过解析歌词文件来实现歌词的显示,使用户可以在听歌的同时查看歌词。 以上就是Android音乐播放器的基本实现步骤,具体实现过程中需要根据实际情况进行调整和修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值