手机增加一个新的实体按键

2017-03-02  本文已影响1274人  Exception_Cui
本文基于android 6.0 进行增加

安卓按键的几种方式

Paste_Image.png

ACCDET 模式, 耳机
mtk-kpd 模式 普通按键,
其他模式可以自己测试

需求: 特殊定制的耳机增加一个按键,发送特定的广播

1.驱动层进行按键定义

耳机:ACCDET.KL (/device/mediatek/mt6580/ACCDET.KL)
自己找对应的,这是MTK给我们的版本 我这里定义的是 key 252 HEADSET_PTT

key 122   ENDCALL
key 163   MEDIA_NEXT
key 164   HEADSETHOOK
key 165   MEDIA_PREVIOUS
key 114   VOLUME_DOWN
key 115   VOLUME_UP
key 582   VOICE_ASSIST
key 252   HEADSET_PTT   

这是固定的写法,注意这个值不要冲突
如果是手机上的按键:mtk-kpd.kl(/device/haocheng/r882/mtk-kpd.kl)

所有按键码都不能冲图

input.h(kernel-3.18/include/uapi/linux/input.h)

代码太多,只提取增加部分

...
#define KEY_HEADSET_PTT 252  //chc add
...

...

KeyCodes.h(/frameworks/native/include/android/KeyCodes.h)

/*
 * Key codes.
 */
enum {      
    AKEYCODE_HEADSET_PTT         = 276,  //chc add  这个值是我们上层所需要的 276  ,不能重复
};

InputEventLabels.h(/frameworks/native/include/input/InputEventLabels.h)

 DEFINE_KEYCODE(HEADSET_PTT),  // chc add

attrs.xml(frameworks/base/core/res/res/values/attrs.xml)

    <attr name="keycode"> 
        ...
        <enum name="KEYCODE_HEADSET_PTT" value="276" /> <!--chc add -->     
       ... 
   </attr>

KeyEvent.java(frameworks/base/core/java/android/view/KeyEvent.java)

 ...
     /**
     * @hide
     */
    public static final int KEYCODE_HEADSET_PTT     =   276;  //chc add  这个值个attrs.xml  InputEventLabels.h 值相同
    
    private static final int LAST_KEYCODE = KEYCODE_HEADSET_PTT;  






 public static final boolean isSystemKey(int keyCode) {
 ...
         switch (keyCode) {
               case KeyEvent.KEYCODE_HEADSET_PTT:   //chc add
            return true;
          }
 ...
  }
...


public static final boolean isMediaKey(int keyCode) {  //因为是耳机上的多以这个也得加
      
         switch (keyCode) {
               case KeyEvent.KEYCODE_HEADSET_PTT:   //chc add
            return true;
          }

}

到此这个按键就可以正常工作了

接下来就是自己的处理逻辑了

PhoneWindowManager.java(frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java)

...
 @Override
    public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags) {
      ...
      case KeyEvent.KEYCODE_HEADSET_PTT:{
                if(down){
                    if(isKeyCodeActivity()) {
                        result |=ACTION_PASS_TO_USER;
                        break;
                    }
                    Intent intent = new Intent();  
                    intent.setAction("android.zed3.action.HEADSET_BUTTON_DOWN");
                    intent.setFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
                    mContext.sendBroadcast(intent); 
                }else{
                    if(isKeyCodeActivity()) {
                        result |=ACTION_PASS_TO_USER;
                        break;
                    }
                    Intent intent = new Intent();  
                    intent.setAction("android.zed3.action.HEADSET_BUTTON_UP");
                    intent.setFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
                     mContext.sendBroadcast(intent);
                    }
                break;
            }         
      ...
    }
...

到此 一个新增的耳机按键就添加完成了

上一篇下一篇

猜你喜欢

热点阅读