通过广播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 开发教程】经过预定义的查询字符串常量
  3. 利用第三方jar包jaudiotagger实现与MediaMetadataRetriever类似
  4. Android 音乐乱码问题修改
  5. Android 初步学习BroadCast与Service实现简单的音乐播放器
  6. Android音乐播放器进度条实现
  7. Android 录音 与播放本地音乐功能的实现
  8. Android利用Service实现简易音乐播放器
  9. android通过耳机控制音乐播放器

随机推荐

  1. 使用表格布局编写登录页面实例
  2. Android学习06-----布局管理器
  3. android commend build.xml
  4. [002] Android系统简介
  5. j2me与android的区别
  6. 利用android的Debug调试分析源码
  7. Android(安卓)NDK 入门之开发环境搭建
  8. 处女男学Android(十二)---Android(安卓)菜
  9. Android中获取文本宽度和高度
  10. Android控件之TextView全解析