通过广播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。

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常量在类的开头定义为:

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")的内容,进行相应操作,控制播放器的播放。

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控制播放器了:

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通过jni控制service服务程序的简易流程
  2. Android(安卓)matrix 控制图片的旋转、缩放、移动
  3. android 自定义view
  4. Android(安卓)MediaPlayer音乐播放
  5. android控制home键 代码
  6. Android控制台中运行Java程序
  7. Android(安卓)Screen Monitor抓取真机屏幕
  8. 浅析android下如何通过jni监控wifi网络连接、dhcpcd执行和power
  9. android 播放assets目录内的音乐,及使用Seekbar控制播放进度

随机推荐

  1. 苹果发大招 Android用户轻松迁移ios
  2. android游戏开发适应多屏幕的问题 .
  3. Android之增长的数字(仿支付宝资产数字)
  4. 我的Android学习.入门小基础(一)
  5. Android(安卓)Studio中mergeDebugResourc
  6. Android之ListView原理学习与优化总结
  7. Android(安卓)侧滑关闭Activity的实例
  8. 滤镜开发(一) 开篇:关于滤镜
  9. android listView 到上下边界 蓝色或黄色
  10. 【已解决】Android(安卓)Studio中不能使