通过广播Intent控制Android系统自带的音乐播放器
通过广播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 ?
- publicvoidonCreate(){
- super.onCreate();
- ……
- IntentFiltercommandFilter=newIntentFilter();
- 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 ?
- publicstaticfinalStringSERVICECMD="com.android.music.musicservicecommand";
- publicstaticfinalStringCMDNAME="command";
- publicstaticfinalStringCMDTOGGLEPAUSE="togglepause";
- publicstaticfinalStringCMDSTOP="stop";
- publicstaticfinalStringCMDPAUSE="pause";
- publicstaticfinalStringCMDPREVIOUS="previous";
- publicstaticfinalStringCMDNEXT="next";
- publicstaticfinalStringTOGGLEPAUSE_ACTION="com.android.music.musicservicecommand.togglepause";
- publicstaticfinalStringPAUSE_ACTION="com.android.music.musicservicecommand.pause";
- publicstaticfinalStringPREVIOUS_ACTION="com.android.music.musicservicecommand.previous";
- publicstaticfinalStringNEXT_ACTION="com.android.music.musicservicecommand.next";
BroadcastReceiver接收和IntentFilter匹配的Intent。根据intent.getAction或intent.getStringExtra("command")的内容,进行相应操作,控制播放器的播放。
[java] view plain copy print ?- privateBroadcastReceivermIntentReceiver=newBroadcastReceiver(){
- @Override
- publicvoidonReceive(Contextcontext,Intentintent){
- Stringaction=intent.getAction();
- Stringcmd=intent.getStringExtra("command");
- MusicUtils.debugLog("mIntentReceiver.onReceive"+action+"/"+cmd);
- if(CMDNEXT.equals(cmd)||NEXT_ACTION.equals(action)){
- next(true);
- }elseif(CMDPREVIOUS.equals(cmd)||PREVIOUS_ACTION.equals(action)){
- prev();
- }elseif(CMDTOGGLEPAUSE.equals(cmd)||TOGGLEPAUSE_ACTION.equals(action)){
- if(isPlaying()){
- pause();
- mPausedByTransientLossOfFocus=false;
- }else{
- play();
- }
- }elseif(CMDPAUSE.equals(cmd)||PAUSE_ACTION.equals(action)){
- pause();
- mPausedByTransientLossOfFocus=false;
- }elseif(CMDSTOP.equals(cmd)){
- pause();
- mPausedByTransientLossOfFocus=false;
- seek(0);
- }elseif(MediaAppWidgetProvider.CMDAPPWIDGETUPDATE.equals(cmd)){
- //Someoneaskedustorefreshasetofspecificwidgets,probably
- //becausetheywerejustadded.
- int[]appWidgetIds=intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS);
- mAppWidgetProvider.performUpdate(MediaPlaybackService.this,appWidgetIds);
- }
- }
- };
由此,我们可以通过广播intent控制播放器了:
[java] view plain copy print ?
- Intentintent=newIntent("上面那几个常量");
- sendBroadcast(intent);
参考资料:
http://www.poemcode.net/2009/11/android_music/
http://android.git.kernel.org/?p=platform/packages/apps/Music.git;a=tree
更多相关文章
- Android实现网络音乐播放器
- 【Android 开发教程】经过预定义的查询字符串常量
- 利用第三方jar包jaudiotagger实现与MediaMetadataRetriever类似
- Android 音乐乱码问题修改
- Android 初步学习BroadCast与Service实现简单的音乐播放器
- Android音乐播放器进度条实现
- Android 录音 与播放本地音乐功能的实现
- Android利用Service实现简易音乐播放器
- android通过耳机控制音乐播放器