通过广播Intent控制Android系统自带的音乐播放器

ZhengZhiren

http://blog.csdn.net/ZhengZhiRen/archive/2011/01/13/6134730.aspx

Android自带的音乐播放器只能算是系统之上的应用,并不包含在SDK中,因此SDK文档中没有提及。但是,有时我们需要控制系统音乐播放器的行为,比如切换歌曲、暂停/继续等。这就只能从这个应用的源代码着手了。

这是播放器的代码树:

http://android.git.kernel.org/?p=platform/packages/apps/Music.git;a=tree

可以看到,音乐的播放是由MediaPlaybackService这个服务实现的:

http://android.git.kernel.org/?p=platform/packages/apps/Music.git;a=blob;f=src/com/android/music/MediaPlaybackService.java;h=7c0bbedbedef49bf4c38ef97fdcd0f1017bf5d35;hb=HEAD

在服务的onCreate函数中,注册了IntentFilter和BroadcastReceiver。

[java] view plain copy print ?
  1. publicvoidonCreate(){
  2. super.onCreate();
  3. ……
  4. IntentFiltercommandFilter=newIntentFilter();
  5. commandFilter.addAction(SERVICECMD);
  6. commandFilter.addAction(TOGGLEPAUSE_ACTION);
  7. commandFilter.addAction(PAUSE_ACTION);
  8. commandFilter.addAction(NEXT_ACTION);
  9. commandFilter.addAction(PREVIOUS_ACTION);
  10. registerReceiver(mIntentReceiver,commandFilter);
  11. ……
  12. }
public void onCreate() { super.onCreate(); …… IntentFilter commandFilter = new IntentFilter(); commandFilter.addAction(SERVICECMD); commandFilter.addAction(TOGGLEPAUSE_ACTION); commandFilter.addAction(PAUSE_ACTION); commandFilter.addAction(NEXT_ACTION); commandFilter.addAction(PREVIOUS_ACTION); registerReceiver(mIntentReceiver, commandFilter); …… }

这些Action常量在类的开头定义为:

[java] view plain copy print ?
  1. publicstaticfinalStringSERVICECMD="com.android.music.musicservicecommand";
  2. publicstaticfinalStringCMDNAME="command";
  3. publicstaticfinalStringCMDTOGGLEPAUSE="togglepause";
  4. publicstaticfinalStringCMDSTOP="stop";
  5. publicstaticfinalStringCMDPAUSE="pause";
  6. publicstaticfinalStringCMDPREVIOUS="previous";
  7. publicstaticfinalStringCMDNEXT="next";
  8. publicstaticfinalStringTOGGLEPAUSE_ACTION="com.android.music.musicservicecommand.togglepause";
  9. publicstaticfinalStringPAUSE_ACTION="com.android.music.musicservicecommand.pause";
  10. publicstaticfinalStringPREVIOUS_ACTION="com.android.music.musicservicecommand.previous";
  11. publicstaticfinalStringNEXT_ACTION="com.android.music.musicservicecommand.next";
public static final String SERVICECMD = "com.android.music.musicservicecommand"; public static final String CMDNAME = "command"; public static final String CMDTOGGLEPAUSE = "togglepause"; public static final String CMDSTOP = "stop"; public static final String CMDPAUSE = "pause"; public static final String CMDPREVIOUS = "previous"; public static final String CMDNEXT = "next"; public static final String TOGGLEPAUSE_ACTION = "com.android.music.musicservicecommand.togglepause"; public static final String PAUSE_ACTION = "com.android.music.musicservicecommand.pause"; public static final String PREVIOUS_ACTION = "com.android.music.musicservicecommand.previous"; public static final String NEXT_ACTION = "com.android.music.musicservicecommand.next";

BroadcastReceiver接收和IntentFilter匹配的Intent。根据intent.getAction或intent.getStringExtra("command")的内容,进行相应操作,控制播放器的播放。

[java] view plain copy print ?
  1. privateBroadcastReceivermIntentReceiver=newBroadcastReceiver(){
  2. @Override
  3. publicvoidonReceive(Contextcontext,Intentintent){
  4. Stringaction=intent.getAction();
  5. Stringcmd=intent.getStringExtra("command");
  6. MusicUtils.debugLog("mIntentReceiver.onReceive"+action+"/"+cmd);
  7. if(CMDNEXT.equals(cmd)||NEXT_ACTION.equals(action)){
  8. next(true);
  9. }elseif(CMDPREVIOUS.equals(cmd)||PREVIOUS_ACTION.equals(action)){
  10. prev();
  11. }elseif(CMDTOGGLEPAUSE.equals(cmd)||TOGGLEPAUSE_ACTION.equals(action)){
  12. if(isPlaying()){
  13. pause();
  14. mPausedByTransientLossOfFocus=false;
  15. }else{
  16. play();
  17. }
  18. }elseif(CMDPAUSE.equals(cmd)||PAUSE_ACTION.equals(action)){
  19. pause();
  20. mPausedByTransientLossOfFocus=false;
  21. }elseif(CMDSTOP.equals(cmd)){
  22. pause();
  23. mPausedByTransientLossOfFocus=false;
  24. seek(0);
  25. }elseif(MediaAppWidgetProvider.CMDAPPWIDGETUPDATE.equals(cmd)){
  26. //Someoneaskedustorefreshasetofspecificwidgets,probably
  27. //becausetheywerejustadded.
  28. int[]appWidgetIds=intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS);
  29. mAppWidgetProvider.performUpdate(MediaPlaybackService.this,appWidgetIds);
  30. }
  31. }
  32. };
private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); String cmd = intent.getStringExtra("command"); MusicUtils.debugLog("mIntentReceiver.onReceive " + action + " / " + cmd); if (CMDNEXT.equals(cmd) || NEXT_ACTION.equals(action)) { next(true); } else if (CMDPREVIOUS.equals(cmd) || PREVIOUS_ACTION.equals(action)) { prev(); } else if (CMDTOGGLEPAUSE.equals(cmd) || TOGGLEPAUSE_ACTION.equals(action)) { if (isPlaying()) { pause(); mPausedByTransientLossOfFocus = false; } else { play(); } } else if (CMDPAUSE.equals(cmd) || PAUSE_ACTION.equals(action)) { pause(); mPausedByTransientLossOfFocus = false; } else if (CMDSTOP.equals(cmd)) { pause(); mPausedByTransientLossOfFocus = false; seek(0); } else if (MediaAppWidgetProvider.CMDAPPWIDGETUPDATE.equals(cmd)) { // Someone asked us to refresh a set of specific widgets, probably // because they were just added. int[] appWidgetIds = intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS); mAppWidgetProvider.performUpdate(MediaPlaybackService.this, appWidgetIds); } } };

由此,我们可以通过广播intent控制播放器了:

[java] view plain copy print ?
  1. Intentintent=newIntent("上面那几个常量");
  2. sendBroadcast(intent);
Intent intent = new Intent("上面那几个常量"); sendBroadcast(intent);

参考资料:

http://www.poemcode.net/2009/11/android_music/

http://android.git.kernel.org/?p=platform/packages/apps/Music.git;a=tree

更多相关文章

  1. Android(安卓)- 文本框的输入法控制和默认焦点设置
  2. android wifi 设置 控制开关
  3. 64位Fedora中搭建Android环境没有兼容的32位包引起的错误的解决
  4. Android(安卓)各种音量的获取和设置
  5. Android总结笔记
  6. android输入法控制显示
  7. Android(安卓)控制软键盘的显示与隐藏
  8. Android实现网络音乐播放器
  9. 挂载android只读文件系统为可读写

随机推荐

  1. Android判断Intent是否存在,是否可用
  2. Android——继承SimpleAdapter重写自己的
  3. android LinearLayout 动态添加子View
  4. Android(安卓)编程下 Touch 事件的分发和
  5. Android(安卓)百度地图笔记
  6. android wifi 处理
  7. android XML文件序列化
  8. Android(安卓)jni调用,实现自己的JNI_OnLo
  9. Native+WebApp中Phonegap调用Android(安
  10. Android(安卓)处理 Button 单击事件的三