代码路径:
frameworks/base/data/keyboards/Generic.kl
frameworks/base/data/keyboards/qwerty.kl
/device/sprd/sharkle/common/rootdir/system/usr/keylayout/gpio-keys.kl
frameworks/native/include/input/KeycodeLabels.h
frameworks/native/include/android/keycodes.h
frameworks/base/core/java/android/view/KeyEvent.java
frameworks/base/core/res/res/values/attrs.xml
frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
在gpio-keys.kl文件中定义按键,这里定义的按键是十进制和16进制
key 114 VOLUME_DOWN WAKE key 115 VOLUME_UP WAKE key 116 POWER WAKE key 212 CAMERA WAKE key 0x210 FOCUS WAKE key 700 RECORD_MUTE
在qwerty.kl文件中也定义了按键,这里定义也是十进制的,这里定义按键和gpio-keys.kl文件中一样的
key 116 POWER WAKE key 700 RECORD_MUTE key 158 BACK WAKE_DROPPED key 230 SOFT_RIGHT WAKE key 60 SOFT_RIGHT WAKE key 107 ENDCALL WAKE_DROPPED key 62 ENDCALL WAKE_DROPPED key 229 MENU WAKE_DROPPED key 139 MENU WAKE_DROPPED key 59 MENU WAKE_DROPPED key 127 SEARCH WAKE_DROPPED key 217 SEARCH WAKE_DROPPED
在Generic.kl文件中也定义了按键,这里定义也是十进制的,这里定义按键和gpio-keys.kl文件中一样的
key 700 RECORD_MUTE key 116 POWER WAKE
在keycodes.h文件中定义枚举变量
AKEYCODE_EISU = 212,
AKEYCODE_MUHENKAN = 213,
AKEYCODE_HENKAN = 214,
AKEYCODE_KATAKANA_HIRAGANA = 215,
AKEYCODE_YEN = 216,
AKEYCODE_RO = 217,
AKEYCODE_KANA = 218,
AKEYCODE_ASSIST = 219,
AKEYCODE_BRIGHTNESS_DOWN = 220,
AKEYCODE_BRIGHTNESS_UP = 221,
AKEYCODE_MEDIA_AUDIO_TRACK = 222,
AKEYCODE_RECORD_MUTE = 300,
AKEYCODE_RECORD_SELECT = 301,
AKEYCODE_RECORD_OK = 302,
在KeycodeLabels.h文件中KEYCODES[]数组中定义需要添加的变量
static const KeycodeLabel KEYCODES[] = {
{ "SOFT_LEFT", 1 },
{ "SOFT_RIGHT", 2 },
{ "HOME", 3 },
{ "BACK", 4 },
{ "CALL", 5 },
{ "BRIGHTNESS_DOWN", 220 },
{ "BRIGHTNESS_UP", 221 },
{ "MEDIA_AUDIO_TRACK", 222 },
{ "RECORD_MUTE", 300 },
{ "RECORD_SELECT", 301 },
{ "RECORD_OK", 302 },
// NOTE: If you add a new keycode here you must also add it to several other files.
// Refer to frameworks/base/core/java/android/view/KeyEvent.java for the full list.
{ NULL, 0 }
};
在attrs.xml文件中定义keycode
在KeyEvent.java文件中定义KEYCODE的值
public static final int KEYCODE_RECORD_MUTE = 300;
public static final int KEYCODE_RECORD_SELECT = 301;
public static final int KEYCODE_RECORD_OK = 302;
private static final int LAST_KEYCODE = KEYCODE_RECORD_OK;
在/PhoneWindowManager.java文件中interceptKeyBeforeDispatching()方法来监听按键的处理
@Override
public long interceptKeyBeforeDispatching(WindowState win, KeyEvent event, int policyFlags) {
final boolean keyguardOn = keyguardOn();
final int keyCode = event.getKeyCode();
final int repeatCount = event.getRepeatCount();
final int metaState = event.getmetaState();
final int flags = event.getFlags();
final boolean down = event.getAction() == KeyEvent.ACTION_DOWN;
final boolean canceled = event.isCanceled();
//if (DEBUG_INPUT) {
if (down == true) {
Log.d(TAG, "interceptKeyTi keyCode=" + keyCode + " down=" + down + " repeatCount="
+ repeatCount + " keyguardOn=" + keyguardOn + " mHomePressed=" + mHomePressed
+ " canceled=" + canceled);
}
//}
if (down && isCallWakeKey(keyCode)) {
if(mKeyguardDelegate != null && !mKeyguardDelegate.isShowing()){
mPowerManager.scheduleButtonLightTimeout(SystemClock.uptimeMillis());
}
}
// If we think we might have a volume down & power key chord on the way
// but we're not sure, then tell the dispatcher to wait a little while and
// try again later before dispatching.
if (mScreenshotChordEnabled && (flags & KeyEvent.FLAG_FALLBACK) == 0) {
if (mVolumeDownKeyTriggered && !mPowerKeyTriggered) {
final long now = SystemClock.uptimeMillis();
final long timeoutTime = mVolumeDownKeyTime + SCREENSHOT_CHORD_DEBOUNCE_DELAY_MILLIS;
if (now < timeoutTime) {
return timeoutTime - now;
}
}
if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN
&& mVolumeDownKeyConsumedByScreenshotChord) {
if (!down) {
mVolumeDownKeyConsumedByScreenshotChord = false;
}
return -1;
}
}



