zoukankan      html  css  js  c++  java
  • MTK Android 耳机线控的实现方法

    android 耳机线控的实现方法

    keycodeonkeydownkeyevent
    耳机线控的功能
    耳机线控是一种很好用,并且能提升用户体验的功能。可以用来实现一些常用和基本的功能。比如:实现音乐播放的控制,接听电话,音量控制等。下面写一下耳机线控的几种实现方式。

    耳机线控的实现
    耳机线控实现方式主要有两种,(注:可能出现无法获取键值的问题,可能导致的原因是: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); 


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

  • 相关阅读:
    POJ1422 最小路径覆盖
    POJ1422 最小路径覆盖
    POJ1125 Floyd
    POJ1125 Floyd
    POJ2570 二进制,位运算,Floyd
    POJ2570 二进制,位运算,Floyd
    POJ2446 二分匹配
    POJ2536 二分图匹配
    POJ2536 二分图匹配
    POJ3692 最大点权独立集元素个数
  • 原文地址:https://www.cnblogs.com/cyqx/p/4886064.html
Copyright © 2011-2022 走看看