/* Android Media Button */
顾名思义Media Button是Android 定义的媒体按键,一般来说Android设备的按键事件的是由
Activity进行捕捉的,需要在Activity覆盖在屏幕的最上层。但Android 里面对Media Button做
了特别的处理,为了使应用程序没有在屏幕的最上层,也能够获取Media Button事件。
/* 哪些按键是Media Button */
* {@link KeyEvent#KEYCODE_MUTE},
* {@link KeyEvent#KEYCODE_HEADSETHOOK},
* {@link KeyEvent#KEYCODE_MEDIA_PLAY},
* {@link KeyEvent#KEYCODE_MEDIA_PAUSE},
* {@link KeyEvent#KEYCODE_MEDIA_PLAY_PAUSE},
* {@link KeyEvent#KEYCODE_MEDIA_STOP},
* {@link KeyEvent#KEYCODE_MEDIA_NEXT},
* {@link KeyEvent#KEYCODE_MEDIA_PREVIOUS},
* {@link KeyEvent#KEYCODE_MEDIA_REWIND},
* {@link KeyEvent#KEYCODE_MEDIA_RECORD},
* {@link KeyEvent#KEYCODE_MEDIA_FAST_FORWARD},
* {@link KeyEvent#KEYCODE_MEDIA_CLOSE},
* {@link KeyEvent#KEYCODE_MEDIA_EJECT},
/* 如何在Activity上捕捉Media Button */
在任意一个有交互界面的应用程序都会继承Activity标准类,这个类里
默认有两种方法捕捉Media Button事件
public boolean onKeyDown(int keyCode, KeyEvent event)
public boolean onKeyUp(int keyCode, KeyEvent event)
public boolean dispatchKeyEvent(KeyEvent event)
这三个方法的返回值都是boolean,如果返回值是true,表示这个事件
不要再被传递。如果返回值是false,表示这事件会被继续传递下去。
默认返回的是false。
这个三个方法的执行顺序是
dispatchKeyEvent => onKeyDown
dispatchKeyEvent => onKeyUp
/* 如何在后台捕捉Media Button */
Android在AudioManager里提供了两个方法,通过Broadcast的方式让应用程序自己定义收到Media Button的事件。
public void registerMediaButtonEventReceiver(ComponentName eventReceiver)
public void registerMediaButtonEventReceiver(PendingIntent eventReceiver)
第一个方法向AudioManager中注册一个特定ComponentName,这个ComponentName
指定了一个在程序manifast中声明的BroadcastReceiver(一定要在manifast中声明,不能
指定动态的BroadcastReceiver)。Media Button事件发生时候,会通过
@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String ACTION_MEDIA_BUTTON = "android.intent.action.MEDIA_BUTTON"
并携带keyevent将Media Button事件发送给程序
KeyEvent keyEvent = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT)
第二个方法是向AudioManager注册一个特定的Media Button触发的Intent。第一个方法的Intent的Action只能是”android.intent.action.MEDIA_BUTTON”,第二个方法Intent的Action可以由开发者自行定义,并且BroadcastReceiver不需要在manifast中静态声明。
mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
PendingIntent pd = PendingIntent.getBroadcast(getApplicationContext(),0,
new Intent("PRIVATE.MEDIA.BUTTON.EVENT"), PendingIntent.FLAG_UPDATE_CURRENT);
mAudioManager.registerMediaButtonEventReceiver(pd);
在两个方法的注释中都指明了,在AudioManager中注册了该BroadcastReceiver,那个这个Receiver将是Media Button的唯一处理者。也就是说系统只向最后一个调用registerMediaButtonEventReceiver的对象发送Broadcast。
/* 优先权的关系 */
Activity获取Media Button事件的优先权高于后台Broadcast,所以在执行顺序上是程序先执行dispatchKeyEvent,然后再处理Broadcast。并且如果dispatchKeyEvent的返回值是true,会中止Media Button事件的传递。