手机增加一个新的实体按键
2017-03-02 本文已影响1274人
Exception_Cui
本文基于android 6.0 进行增加
安卓按键的几种方式
Paste_Image.pngACCDET 模式, 耳机
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;
}
...
}
...
到此 一个新增的耳机按键就添加完成了