Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux / Android中MediaButtonReceiver广播监听器的机制分析

在Android中并没有定义MediaButtonReceive这个广播类,MediaButtonReceive只是作为一种通俗的命名方式来响应插入耳机后,点击耳机上的按钮(名称:MEDIA_BUTTON)接受该广播事件的类。所有该MEDIA_BUTTON的按下我们就简称为MEDIA_BUTTON广播吧。顾名思义:它显然是一个广播接收器类(BroadbcastReceiver),那么它就具备了BroadbcastReceiver类的使用方式,但是,因为它需要通过AudioManager对象注册,所以它有着自己的独特之处(否则我也不会单独拿出来分析,- -),后面我们会慢慢的讲解。点击MEDIA_BUTTON发送的Intent Action 为:ACTION_MEDIA_BUTTON  ="android.intent.action.MEDIA_BUTTON"Intent 附加值为(Extra)点击MEDIA_BUTTON的按键码 :                            //获得KeyEvent对象                        KeyEvent keyEvent = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);                        //获得Action                         String intentAction = intent.getAction() ; AudioManager对象注册MEDIA_BUTTON广播的方法原型为:    public voidregisterMediaButtonEventReceiver(ComponentNameeventReceiver)          Register a component to be the sole receiverof MEDIA_BUTTON intents          Parameters:                                   eventReceiver  : identifier of a BroadcastReceiver that will receive the media button intent. This broadcast receiver                                   must be declared in the application manifest.   从注释可知以下两点:      1、 在AudioManager对象注册一个MediaoButtonRecevie,使它成为MEDIA_BUTTON的唯一接收器(这很重要,          我们会放在后面讲解)   也就是说只有我能收到,其他的都收不到这个广播了,否则的话大家都收到会照成一定的混乱;       2、   该广播必须在AndroidManifest.xml文件中进行声明,否则就监听不到该MEDIA_BUTTON广播了。 下面我们就简单的写一个MediaButtonReceiver类,并且在AndroidManifest.xml定义 1、  自定义的MediaButtonReceiver 广播类[java]
  1. package com.qin.mediabutton;  
  2.   
  3. import android.content.BroadcastReceiver;  
  4. import android.content.Context;  
  5. import android.content.Intent;  
  6. import android.util.Log;  
  7. import android.view.KeyEvent;  
  8.   
  9. public class MediaButtonReceiver extends BroadcastReceiver {  
  10.     private static String TAG = "MediaButtonReceiver";  
  11.     @Override  
  12.     public void onReceive(Context context, Intent intent) {  
  13.         // 获得Action   
  14.         String intentAction = intent.getAction();  
  15.         // 获得KeyEvent对象   
  16.         KeyEvent keyEvent = (KeyEvent) intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);  
  17.   
  18.         Log.i(TAG, "Action ---->" + intentAction + "  KeyEvent----->"+ keyEvent.toString());  
  19.   
  20.         if (Intent.ACTION_MEDIA_BUTTON.equals(intentAction)) {  
  21.             // 获得按键字节码   
  22.             int keyCode = keyEvent.getKeyCode();  
  23.             // 按下 / 松开 按钮   
  24.             int keyAction = keyEvent.getAction();  
  25.             // 获得事件的时间   
  26.             long downtime = keyEvent.getEventTime();  
  27.   
  28.             // 获取按键码 keyCode   
  29.             StringBuilder sb = new StringBuilder();  
  30.             // 这些都是可能的按键码 , 打印出来用户按下的键   
  31.             if (KeyEvent.KEYCODE_MEDIA_NEXT == keyCode) {  
  32.                 sb.append("KEYCODE_MEDIA_NEXT");  
  33.             }  
  34.             // 说明:当我们按下MEDIA_BUTTON中间按钮时,实际出发的是 KEYCODE_HEADSETHOOK 而不是   
  35.             // KEYCODE_MEDIA_PLAY_PAUSE   
  36.             if (KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE == keyCode) {  
  37.                 sb.append("KEYCODE_MEDIA_PLAY_PAUSE");  
  38.             }  
  39.             if (KeyEvent.KEYCODE_HEADSETHOOK == keyCode) {  
  40.                 sb.append("KEYCODE_HEADSETHOOK");  
  41.             }  
  42.             if (KeyEvent.KEYCODE_MEDIA_PREVIOUS == keyCode) {  
  43.                 sb.append("KEYCODE_MEDIA_PREVIOUS");  
  44.             }  
  45.             if (KeyEvent.KEYCODE_MEDIA_STOP == keyCode) {  
  46.                 sb.append("KEYCODE_MEDIA_STOP");  
  47.             }  
  48.             // 输出点击的按键码   
  49.             Log.i(TAG, sb.toString());  
  50.         }  
  51.     }  
  52. }  
   2、  在AndroidManifest.xml声明我们定义的广播类。 [java]
  1.  <receiver android:name="MediaButtonReceiver">  
  2.   <intent-filter >  
  3.         <action android:name="android.intent.action.MEDIA_BUTTON"></action>  
  4.   </intent-filter>  
  5. </receiver>  
          在模拟器上,我们可以手动构造MEDA_BUTTON的广播,并且将它发送出去(后面会介绍)。
         如果有真机测试的话,按下MEDIA_BUTTON是可以接受到MEDIA_BUTTON广播的,如果没有接受到,请关闭所有应用   程序,在观察效果。   继续我们的下一步分析:         前面我们说明通过registerMediaButtonEventReceiver(eventReceiver)方法注册时使它成为MEDIA_BUTTON的     唯一 接收器。这个唯一是怎么实现的呢? 我们在源码中,一步步追本溯源,相信一定可以找到答案,知道这“唯一“是    怎么来的。 第一步、   为AudioManager注册一个MediaButtonReceiver() ;[java]
  1. //获得AudioManager对象   
  2. AudioManager mAudioManager =(AudioManager)getSystemService(Context.AUDIO_SERVICE);     
  3. //构造一个ComponentName,指向MediaoButtonReceiver类   
  4. //下面为了叙述方便,我直接使用ComponentName类来替代MediaoButtonReceiver类   
  5. ComponentName  mbCN = new ComponentName(getPackageName(),MediaButtonReceiver.class.getName());  
  6. //注册一个MedioButtonReceiver广播监听   
  7. mAudioManager.registerMediaButtonEventReceiver(mbCN);  
  8. //取消注册的方法   
  9. mAudioManager.unregisterMediaButtonEventReceiver(mbCN);  
              MediaButtonReceiver就是我们用来接收MEDIA_BUTTON的广播类,下面为了叙述方便和直观上得体验,我直接使用    ComponentName类来替代真正的MediaoButtonReceiver广播类。    说明 接下来分析的文件路径全部在   frameworks/base/media/java/android/media/ 下