应用获取Power Key/Home Key按键事件(framework层)

背景

有时候我们在开发的时候需要在应用中获取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)方法中就可以获取到这些按键事件了。

你可能感兴趣的:(应用获取Power Key/Home Key按键事件(framework层))