美文网首页
手机增加一个新的实体按键

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

作者: Exception_Cui | 来源:发表于2017-03-02 11:08 被阅读1274次
    本文基于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;
                }         
          ...
        }
    ...
    

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

    相关文章

      网友评论

          本文标题:手机增加一个新的实体按键

          本文链接:https://www.haomeiwen.com/subject/byjhgttx.html