• 【android】手机增加一个新的实体按键


    本文基于android 6.0 进行增加

    安卓按键的几种方式

    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)

        <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;
                }         
          ...
        }
    ...

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

    【参考链接】
  • 相关阅读:
    快速幂精讲+代码实现
    基数排序
    Java学习-常见排序算法
    C++中不清楚的函数用法汇总
    C++中的堆及常见题目汇总
    django+nginx+uwsgi+vue部署服务器
    nginx+WSGI+uwisgi+uWISI详解及nginx/uwisgi/django交互流程
    C++中的哈希表及常见题目汇总
    C++中的二叉树及相关题目汇总
    C++中的队列及常见题目汇总
  • 原文地址:https://www.cnblogs.com/opensmarty/p/16407867.html
Copyright © 2020-2023  润新知