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);
        }
    }
};
//注:这种方法处理长按之前一定会先执行短按。 


你可能感兴趣的:(Java/Android)