Android 6.0 기반에서 새로운 버튼 추가
Android 버튼의 종류
ACCDET 모드: 이어폰 mtk-kpd 모드: 일반 버튼 다른 모드는 테스트를 통해 확인할 수 있습니다.
요구사항: 특수 제작된 이어폰에 새로운 버튼 추가, 특정한_broadcast 보내기
- 드라이버 레벨에서 버튼 정의
이어폰: 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;
}
...
}
...
이제 새로운 이어폰 버튼이 완성되었습니다.