android 耳机线控的实现方法

耳机线控的功能 耳机线控是一种很好用,并且能提升用户体验的功能。可以用来实现一些常用和基本的功能。比如:实现音乐播放的控制,接听电话,音量控制等。下面写一下耳机线控的几种实现方式。 耳机线控的实现 耳机线控实现方式主要有两种,(注:可能出现无法获取键值的问题,可能导致的原因是:1、驱动不支持;2、按键映射不正确)。 一种是前台的,前台的,在Activity 里处理,只有该Activity 在前台时才会处理按键。 重写onKeyUp()、onKeyDown(),它们分别处理放开事件和按下事件; 代码如下: @Override public boolean onKeyUp(int keyCode, KeyEvent event) {//放开事件处理,keyCode为按键的键值,event 为按键事件的对像,其中包含了按键的信息。 switch(keyCode){ case KeyEvent.KEYCODE_MEDIA_PREVIOUS://耳机三个按键是的上键,注意并不是耳机上的三个按键的物理位置的上下。 //按键功能定义的处理。 case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE://耳机单按键的按键或三按键耳机的中间按键。 case KeyEvent.KEYCODE_HEADSETHOOK://耳机单按键的按键或三按键耳机的中间按键。与上面的按键可能是相同的,具体得看驱动定义。 //按键功能定义的处理。一般与KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE、键的处理一样。 case KeyEvent.KEYCODE_MEDIA_NEXT://耳机三个按键是的下键, //按键功能定义的处理。 } return false;//为true,则其它后台按键处理再也无法处理到该按键,为false,则其它后台按键处理可以继续处理该按键事件。 } @Override public boolean onKeyDown(int keyCode, KeyEvent event) {//按下事件处理,同onKeyUp()方法。 switch(keyCode){ case KeyEvent.KEYCODE_MEDIA_PREVIOUS://耳机三个按键是的上键,注意并不是耳机上的三个按键的物理位置的上下。 //按键功能定义的处理。 //一般把功能定义为 //音乐:播放上一首 //视频:播放上一个视频或后退。 //收音机:向上搜索, case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE://耳机单按键的按键或三按键耳机的中间按键。 case KeyEvent.KEYCODE_HEADSETHOOK://耳机单按键的按键或三按键耳机的中间按键。与上面的按键可能是相同的,具体得看驱动定义。 //按键功能定义的处理。一般与KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE、键的处理一样。 //一般把功能定义为: 音乐播放的播放和暂停 case KeyEvent.KEYCODE_MEDIA_NEXT://耳机三个按键是的下键, //按键功能定义的处理。 //一般把功能定义为: //音乐:播放下一首 //视频:播放下一个视频或前进。 //收音机:向下搜索, } return false;//为true,则其它后台按键处理再也无法处理到该按键,为false,则其它后台按键处理可以继续处理该按键事件。 } @Override public boolean onKeyLongPress(int keyCode, KeyEvent event) {长按事件处理,同onKeyUp()方法。有的手机可能无法收到耳机的长按事件。 switch(keyCode){ case KeyEvent.KEYCODE_MEDIA_PREVIOUS: case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE: case KeyEvent.KEYCODE_HEADSETHOOK: case KeyEvent.KEYCODE_MEDIA_NEXT: } return false; } 另一种是注册监听,监听Intent.ACTION_MEDIA_BUTTON,后台处理按键事件,有优先级,有可能被拦截,接收不到按键事件。 实现方式如下: 1、注册监听Intent.ACTION_MEDIA_BUTTON,代码如下: IntentFilter mediafilter = new IntentFilter(); //拦截按键KeyEvent.KEYCODE_MEDIA_NEXT、KeyEvent.KEYCODE_MEDIA_PREVIOUS、KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE 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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值