耳机按键事件的监听

注册监听,监听Intent.ACTION_MEDIA_BUTTON,后台处理按键事件,有优先级,有可能被拦截,接收不到按键事件。   

实现方式如下:     1、注册监听Intent.ACTION_MEDIA_BUTTON,代码如下:        

 IntentFilter mediafilter = new IntentFilter();        //拦截按键

mediafilter.addAction(Intent.ACTION_MEDIA_BUTTON);       

mediafilter.setPriority(100);//设置优先级,优先级太低可能被拦截,收不到信息。一般默认优先级为0,通话优先级为1,该优先级的值域是-1000到1000。         registerReceiver(mediaButtonReceiver, mediafilter);    

  2、处理广播信息。        

private BroadcastReceiver mediaButtonReceiver = new BroadcastReceiver() {                

 @Override       

 public void onReceive(Context context, Intent intent) {          

  boolean isActionMediaButton = Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction());  //判断是不是耳机按键事件                         

if(!isActionMediaButton) return;                 

  KeyEvent event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);  //判断有没有耳机按键事件               

  if(event==null) return;                       //过滤按下事件               

  boolean isActionUp = (event.getAction()==KeyEvent.ACTION_UP);                

   if(!isActionUp) return;                      //避免在Receiver里做长时间的处理,使得程序在CPU使用率过高的情况下出错,把信息发给handlera处理。               

  int keyCode = event.getKeyCode();                  

 long eventTime = event.getEventTime()-event.getDownTime();//按键按下到松开的时长                 

  Message msg = Message.obtain();                 

  msg.what = 100;                  

 Bundle data = new Bundle();                 

  data.putInt("key_code", keyCode);                   

data.putLong("event_time", eventTime);                  

 msg.setData(data);                  

 handler.sendMessage(msg);                             

  //终止广播(不让别的程序收到此广播,免受干扰)                   

abortBroadcast();      

   }   

 };   

3、在handler中处理按键事件。  

  private Handler handler = new Handler(){       

 @Override             

  public void handleMessage(Message msg) {                 

  int what = msg.what;                  

 switch(what){                   

case 100:                          

 Bundle data = msg.getData();                         

  //按键值                         

  int keyCode = data.getInt("key_code");                          

 //按键时长                          

 long eventTime = data.getLong("event_time");                          

 //设置超过1000毫秒,就触发长按事件  //谷歌把超过1000s定义为长按。                        

 boolean isLongPress = (eventTime>1000);                         

  switch(keyCode){                           

case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE://播放或暂停                               

playOrPause();                              

 break;                            

   //短按=播放下一首音乐,长按=音量加                         

  case KeyEvent.KEYCODE_MEDIA_NEXT:                              

 if(isLongPress){                                      

 adjustVolume(true);//自定义                             

  }else{                                     

  playNext();//自定义                            

   }                              

 break;                          

 //短按=播放上一首音乐,长按=音量减                            

 case KeyEvent.KEYCODE_MEDIA_PREVIOUS:                            

   if(isLongPress){                                      

 adjustVolume(false);//自定义                            

   }else{                                      

 playPrevious();//自定义                             

  }                            

  break;                        

   }                         

  break;                 

  default://其他消息-则扔回上层处理                        

   super.handleMessage(msg);                

   }              

 }      

};   

 //注:这种方法处理长按之前一定会先执行短按。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值