本文基于android 6.0 進行增加
安卓按鍵的幾種方式
Paste_Image.png
ACCDET 模式, 耳機
mtk-kpd 模式 普通按鍵蹦掐,
其他模式可以自己測試
需求: 特殊定制的耳機增加一個按鍵啤贩,發(fā)送特定的廣播
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;
}
...
}
...
到此 一個新增的耳機按鍵就添加完成了