Android에서 새로운 물리형 버튼 추가하기

Android 6.0 기반에서 새로운 버튼 추가

Android 버튼의 종류

ACCDET 모드: 이어폰 mtk-kpd 모드: 일반 버튼 다른 모드는 테스트를 통해 확인할 수 있습니다.

요구사항: 특수 제작된 이어폰에 새로운 버튼 추가, 특정한_broadcast 보내기

  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  //추가한 코드
...

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

/*
 * Key codes.
 */
typedef enum {      
    AKEYCODE_HEADSET_PTT         = 276,  //추가한 코드, 이 값은 중복되지 않아야 합니다.
};

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

    <attr name="keycode"> 
        ...
        <enum name="KEYCODE_HEADSET_PTT" value="276" /> <!--추가한 코드 -->
       ... 
   </attr>

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

 ...
     /**
     * @hide
     */
    public static final int KEYCODE_HEADSET_PTT     =   276;  //추가한 코드, 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:   //추가한 코드
            return true;
          }
 ...
  }
...


public static final boolean isMediaKey(int keyCode) {  //이어폰 버튼이기 때문에 이것도 추가해야 합니다.
         
         switch (keyCode) {
               case KeyEvent.KEYCODE_HEADSET_PTT:   //추가한 코드
            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;
            }         
      ...
    }
...

이제 새로운 이어폰 버튼이 완성되었습니다.

【참고 링크】Android에서 새로운 물리형 버튼 추가

태그: Android android-kernel hardware JNI

6월 10일 17:47에 게시됨