在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 void
registerMediaButtonEventReceiver(ComponentName
eventReceiver) 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] - package com.qin.mediabutton;
-
- import android.content.BroadcastReceiver;
- import android.content.Context;
- import android.content.Intent;
- import android.util.Log;
- import android.view.KeyEvent;
-
- public class MediaButtonReceiver extends BroadcastReceiver {
- private static String TAG = "MediaButtonReceiver";
- @Override
- public void onReceive(Context context, Intent intent) {
- // 获得Action
- String intentAction = intent.getAction();
- // 获得KeyEvent对象
- KeyEvent keyEvent = (KeyEvent) intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
-
- Log.i(TAG, "Action ---->" + intentAction + " KeyEvent----->"+ keyEvent.toString());
-
- if (Intent.ACTION_MEDIA_BUTTON.equals(intentAction)) {
- // 获得按键字节码
- int keyCode = keyEvent.getKeyCode();
- // 按下 / 松开 按钮
- int keyAction = keyEvent.getAction();
- // 获得事件的时间
- long downtime = keyEvent.getEventTime();
-
- // 获取按键码 keyCode
- StringBuilder sb = new StringBuilder();
- // 这些都是可能的按键码 , 打印出来用户按下的键
- if (KeyEvent.KEYCODE_MEDIA_NEXT == keyCode) {
- sb.append("KEYCODE_MEDIA_NEXT");
- }
- // 说明:当我们按下MEDIA_BUTTON中间按钮时,实际出发的是 KEYCODE_HEADSETHOOK 而不是
- // KEYCODE_MEDIA_PLAY_PAUSE
- if (KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE == keyCode) {
- sb.append("KEYCODE_MEDIA_PLAY_PAUSE");
- }
- if (KeyEvent.KEYCODE_HEADSETHOOK == keyCode) {
- sb.append("KEYCODE_HEADSETHOOK");
- }
- if (KeyEvent.KEYCODE_MEDIA_PREVIOUS == keyCode) {
- sb.append("KEYCODE_MEDIA_PREVIOUS");
- }
- if (KeyEvent.KEYCODE_MEDIA_STOP == keyCode) {
- sb.append("KEYCODE_MEDIA_STOP");
- }
- // 输出点击的按键码
- Log.i(TAG, sb.toString());
- }
- }
- }
2、 在AndroidManifest.xml声明我们定义的广播类。
[java] - <receiver android:name="MediaButtonReceiver">
- <intent-filter >
- <action android:name="android.intent.action.MEDIA_BUTTON"></action>
- </intent-filter>
- </receiver>
在模拟器上,我们可以手动构造MEDA_BUTTON的广播,并且将它发送出去(后面会介绍)。
如果有真机测试的话,按下MEDIA_BUTTON是可以接受到MEDIA_BUTTON广播的,如果没有接受到,请关闭所有应用 程序,在观察效果。 继续我们的下一步分析: 前面我们说明通过
registerMediaButtonEventReceiver(eventReceiver)方法注册时
,使它成为MEDIA_BUTTON的
唯一 接收器。这个唯一是怎么实现的呢? 我们在源码中,一步步追本溯源,相信一定可以找到答案,知道这“唯一“是 怎么来的。 第一步、 为AudioManager注册一个MediaButtonReceiver() ;
[java] - //获得AudioManager对象
- AudioManager mAudioManager =(AudioManager)getSystemService(Context.AUDIO_SERVICE);
- //构造一个ComponentName,指向MediaoButtonReceiver类
- //下面为了叙述方便,我直接使用ComponentName类来替代MediaoButtonReceiver类
- ComponentName mbCN = new ComponentName(getPackageName(),MediaButtonReceiver.class.getName());
- //注册一个MedioButtonReceiver广播监听
- mAudioManager.registerMediaButtonEventReceiver(mbCN);
- //取消注册的方法
- mAudioManager.unregisterMediaButtonEventReceiver(mbCN);
MediaButtonReceiver就是我们用来接收MEDIA_BUTTON的广播类,下面为了叙述方便和直观上得体验,我直接使用
ComponentName类来替代真正的MediaoButtonReceiver广播类。 说明 接下来分析的文件路径全部在 frameworks/base/media/java/android/media/ 下