背景
有时候我们在开发的时候需要在应用中获取Power Key,Home Key等按键事件,但是我们知道这些按键属于特殊的按键,应用中并不能获取到。
这些按键在framework层已经被处理掉了,因此我们需要通过一些方法来让应用能获取到。
原理
对于Home Key, Power key这些特殊的按键,应用是不应该获取到的,因为这些按键需要处理一些特殊的事情。
应用获取到后可能会造成隐患,比如按Home 键后不能回到Launcher。
安卓在进行按键分发之前,会被PhoneWindowManager先处理,处理方法为interceptKeyBeforeQueueing(KeyEvent event, int policyFlags)
在这个方法中会决定哪些按键继续往上传递,哪些直接处理调。因此Home Key, Power key在这里就被处理了,不会继续向上传递,因此应用是不能获取到其按键事件的。
实现
既然是在PhoneWindowManager处理掉的,那么我们可以在interceptKeyBeforeQueueing方法中进行修改,让其可以继续传递。
修改方法如下:
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/po
index b2b7341..0bf2249 100755
--- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@@ -2780,6 +2780,10 @@ public class PhoneWindowManager implements WindowManagerPolicy {
// it handle it, because that gives us the correct 5 second
// timeout.
if (keyCode == KeyEvent.KEYCODE_HOME) {
+ if (SystemProperties.get("dev.keycode.debug").equalsIgnoreCase("true")) {
+ if (DEBUG) Slog.d(TAG, "Home key pressed in debug.");
+ return ACTION_PASS_TO_USER;
+ }
// If we have released the home key, and didn't do anything else
// while it was pressed, then it is time to go home!
@@ -5163,6 +5167,11 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
case KeyEvent.KEYCODE_POWER: {
+ if (SystemProperties.get("dev.keycode.debug").equalsIgnoreCase("true")) {
+ if (DEBUG) Slog.d(TAG, "Power key pressed in debug.");
+ return ACTION_PASS_TO_USER;
+ }
+
result &= ~ACTION_PASS_TO_USER;
isWakeKey = false; // wake-up will be handled separately
if (down) {
使用
在需要获取这些按键事件的应用中首先设置"dev.keycode.debug"属性为true。
SystemProperties.set("dev.keycode.debug", "true");
在onKeyDown(int keyCode, KeyEvent event)方法中就可以获取到这些按键事件了。
---------------------
作者:默默9518
来源:优快云
原文:https://blog.youkuaiyun.com/sgzy001/article/details/50961164
版权声明:本文为博主原创文章,转载请附上博文链接!