系统默认的唤醒按键值
public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags) {
final boolean down = event.getAction() == KeyEvent.ACTION_DOWN;
final int keyCode = event.getKeyCode();
int result;
boolean isWakeKey = (policyFlags & WindowManagerPolicy.FLAG_WAKE) != 0
|| event.isWakeKey();
if (interactive || (isInjected && !isWakeKey)) {
} else if (!interactive && shouldDispatchInputWhenNonInteractive(event)) {
} else {
// When the screen is off and the key is not injected, determine whether
// to wake the device but don't pass the key to the application.
result = 0;
if (isWakeKey && (!down || !isWakeKeyWhenScreenOff(keyCode))) {
isWakeKey = false;
}
// Cache the wake key on down event so we can also avoid sending the up event to the app
if (isWakeKey && down) {
mPendingWakeKey = keyCode;
}
}
if (isValidGlobalKey(keyCode)&& mGlobalKeyManager.shouldHandleGlobalKey(keyCode, event)) {
if (isWakeKey) {
wakeUp(event.getEventTime(), mAllowTheaterModeWakeFromKey, "android.policy:KEY");
}
return result;
}
}
private boolean isWakeKeyWhenScreenOff(int keyCode) {
switch (keyCode) {
// ignore volume keys unless docked
case KeyEvent.KEYCODE_VOLUME_UP:
case KeyEvent.KEYCODE_VOLUME_DOWN:
case KeyEvent.KEYCODE_VOLUME_MUTE:
return mDockMode != Intent.EXTRA_DOCK_STATE_UNDOCKED;
// ignore media and camera keys
case KeyEvent.KEYCODE_MUTE:
case KeyEvent.KEYCODE_HEADSETHOOK:
case KeyEvent.KEYCODE_MEDIA_PLAY:
case KeyEvent.KEYCODE_MEDIA_PAUSE:
case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:
case KeyEvent.KEYCODE_MEDIA_STOP:
case KeyEvent.KEYCODE_MEDIA_NEXT:
case KeyEvent.KEYCODE_MEDIA_PREVIOUS:
case KeyEvent.KEYCODE_MEDIA_REWIND:
case KeyEvent.KEYCODE_MEDIA_RECORD:
case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD:
case KeyEvent.KEYCODE_MEDIA_AUDIO_TRACK:
case KeyEvent.KEYCODE_CAMERA:
return false;
}
return true;
}
http://androidxref.com/9.0.0_r3/xref/frameworks/base/core/java/android/view/KeyEvent.java
public static final int KEYCODE_BACK = 4;
public static final int KEYCODE_MENU = 82;
public static final int KEYCODE_WAKEUP = 224;
public static final int KEYCODE_STEM_1 = 265;
public static final int KEYCODE_STEM_2 = 266;
public static final int KEYCODE_STEM_3 = 267;
public static final int KEYCODE_PAIRING = 225;
public final boolean isWakeKey() {
return isWakeKey(mKeyCode);
}
public static final boolean isWakeKey(int keyCode) {
switch (keyCode) {
case KeyEvent.KEYCODE_BACK:
case KeyEvent.KEYCODE_MENU:
case KeyEvent.KEYCODE_WAKEUP:
case KeyEvent.KEYCODE_PAIRING:
case KeyEvent.KEYCODE_STEM_1:
case KeyEvent.KEYCODE_STEM_2:
case KeyEvent.KEYCODE_STEM_3:
return true;
}
}
那驱动层应该汇报何种键值才能唤醒系统呢。
framework键值重定义
驱动层按键值
http://androidxref.com/kernel_3.18/xref/include/uapi/linux/input.h
#define KEY_SLEEP 142 /* SC System Sleep */
#define KEY_WAKEUP 143 /* System Wake Up */
framework按键值功能定义
http://androidxref.com/9.0.0_r3/xref/frameworks/base/data/keyboards/Generic.kl
key 142 SLEEP
key 143 WAKEUP
http://androidxref.com/9.0.0_r3/xref/frameworks/native/include/input/InputEventLabels.h
#将字符加上双引号
##连接字符串
#define DEFINE_KEYCODE(key) { #key, AKEYCODE_##key }
struct InputEventLabel {
const char *literal;
int value;
};
static const InputEventLabel KEYCODES[] = {
...
DEFINE_KEYCODE(SLEEP),
DEFINE_KEYCODE(WAKEUP),
...
}
DEFINE_KEYCODE(SLEEP)就变成了{"SLEEP",AKEYCODE_SLEEP}
http://androidxref.com/9.0.0_r3/xref/frameworks/native/include/android/keycodes.h
AKEYCODE_SLEEP = 223,
AKEYCODE_WAKEUP = 224,
http://androidxref.com/9.0.0_r3/xref/frameworks/base/core/java/android/view/KeyEvent.java
public static final int KEYCODE_SLEEP = 223;
public static final int KEYCODE_WAKEUP = 224;
也就是驱动层的142跟framework层的223对应。
所以驱动层可以汇报已有能唤醒系统的键值,或者修改isWakeKey函数。
在Android5.0之前,可以在相应的kl文件加入WAKE或WAKE_DROPPED参数,如
http://androidxref.com/4.4.4_r1/xref/frameworks/base/data/keyboards/Generic.kl