zoukankan      html  css  js  c++  java
  • [转]通过广播Intent控制Android系统自带的音乐播放器

    转自http://blog.csdn.net/zhengzhiren/article/details/6134730

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

    1. public void onCreate() {  
    2.     super.onCreate();  
    3.     ……  
    4.     IntentFilter commandFilter = new IntentFilter();  
    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. }  

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

    1. public static final String SERVICECMD = "com.android.music.musicservicecommand";  
    2. public static final String CMDNAME = "command";  
    3. public static final String CMDTOGGLEPAUSE = "togglepause";  
    4. public static final String CMDSTOP = "stop";  
    5. public static final String CMDPAUSE = "pause";  
    6. public static final String CMDPREVIOUS = "previous";  
    7. public static final String CMDNEXT = "next";  
    8. public static final String TOGGLEPAUSE_ACTION = "com.android.music.musicservicecommand.togglepause";  
    9. public static final String PAUSE_ACTION = "com.android.music.musicservicecommand.pause";  
    10. public static final String PREVIOUS_ACTION = "com.android.music.musicservicecommand.previous";  
    11. public static final String NEXT_ACTION = "com.android.music.musicservicecommand.next";  

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

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

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

    1. Intent intent = new Intent("上面那几个常量");  
    2. sendBroadcast(intent);  
      

    参考资料:

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

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

  • 相关阅读:
    关于JDK中的设计模式
    关于Java中的构造方法和set方法()给属性赋值
    关于Object[]数组强转成Integer[]类型的数组.
    [ImportNew]Java中的Timer类和TimerTask类
    关于Linux最基本总结
    关于数组
    关于Linux系统和Windows系统中文件夹的命名规范
    关于数组集合之间的转换
    关于Java获取系统信息
    关于Windows常用命令
  • 原文地址:https://www.cnblogs.com/wilma/p/3448198.html
Copyright © 2011-2022 走看看