zoukankan      html  css  js  c++  java
  • Android 监听系统音乐播放器播放的音乐的方法

      最近在做项目的时候遇到一个小问题,就是需要自己写一个View来控制系统音乐播放器的播放行为,并且要能得到正在播放的音乐的信息,可能刚开始是想省点时间,所以就没有直接去看源码,而是上网搜索了一下,但令我十分惊讶的是网上竟然没有这个,难道说没有童鞋做过这个?嘿嘿,啥都不说了,开始:


      获得系统正在播放的音乐的信息,查看源码可以知道,在Music应用中有一个MediaPlaybackService.java文件,内部的代码我就不写了,总之就是在播放音乐的时候会在四种情况下发送广播,这些广播里面包含了正在播放的音乐的信息,所以我们只要写一个广播来接受这些信息就可以了:

      

    MusicBroadcastReceiver mbr = null;//定义


    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();
    	}
    

      注销广播:

      

    @Override
    	protected void onPause() {
    		if(mbr != null){
    			unregisterReceiver(mbr);
    		}
    		super.onPause();
    	}
    

      控制音乐的播放:

        同样在Music应用中有一个MediaButtonIntentReceiver接受着,当我们我们可以发送特定的广播来控制音乐的播放,如下:

    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,只需要把:

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

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

      

      

  • 相关阅读:
    C# WinForm多线程(一)Thread类库
    ASP.NET执行循序
    SQLSERVER2014的内存优化表
    C# 5.0 Async函数的提示和技巧
    WPF 绑定
    使用 Cordova+Visual Studio 创建跨平台移动应用(3)
    使用 Cordova+Visual Studio 创建跨平台移动应用(2)
    使用 WPF 创建预加载控件
    A WPF/MVVM Countdown Timer
    使用WPF创建无边框窗体
  • 原文地址:https://www.cnblogs.com/xinye/p/music_info.html
Copyright © 2011-2022 走看看