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

首页 / 操作系统 / Linux / Android 耳机按钮监听

在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);//获得ActionString intentAction = intent.getAction() ;AudioManager对象注册MEDIA_BUTTON广播的方法原型为:public voidregisterMediaButtonEventReceiver(ComponentNameeventReceiver)Register a component to be the sole receiverof MEDIA_BUTTON intentsParameters:eventReceiver  : identifier of a BroadcastReceiver that will receive the media button intent. This broadcast receivermust bedeclared in the application manifest.从注释可知以下两点:
  1. 在AudioManager对象注册一个MediaoButtonRecevie,使它成为MEDIA_BUTTON的唯一接收器(这很重要,我们会放在后面讲解)  也就是说只有我能收到,其他的都收不到这个广播了,否则的话大家都收到会照成一定的混乱;
  2. 该广播必须在AndroidManifest.xml文件中进行声明,否则就监听不到该MEDIA_BUTTON广播了。
下面我们就简单的写一个MediaButtonReceiver类,并且在AndroidManifest.xml定义1、  自定义的MediaButtonReceiver 广播类
  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.     } 
2、在AndroidManifest.xml声明我们定义的广播类。
  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广播的,如果没有接受到,请关闭所有应用程序,在观察效果。