admin管理员组

文章数量:1530518

首先说一下,目前Android所支持的keyboard快捷键:(部分无效)

ESC = 后退

Print Screen = 截屏

Ctrl + P = 设置

Ctrl + W = 设置壁纸

ctrl + M = 打开系统菜单中的应用程序项

ctrl + Alt + Del = 重启

Alt + Space  = 打开Google now

Alt + Tab = 切换任务

Win + A = 计算器

Win + B = 浏览器

Win + C = 通讯录

Win + E = 邮件

步入正题,当需要屏蔽掉Win+B的快捷键时 ;

第一步:猜想是在 PhoneWindowManager.java判断是否有直接对应的值.

单纯获取 getevent -l,并未获取到特殊的值.

接下来抓取 PhoneWindowManager.java 相关log.

logcat -v time 

11-17 06:45:57.876 +0000   495   595 D WindowManager: interceptKeyTq keycode=117 interactive=true keyguardActive=false policyFlags=22000001
11-17 06:45:57.876 +0000   495   594 D WindowManager: interceptKeyTi keyCode=117 down=true repeatCount=0 keyguardOn=false mHomePressed=false canceled=false
11-17 06:45:57.877 +0000   495   594 D WindowManager: Unhandled key: win=Window{e8c21d u0 com.android.tv.settings/com.android.tv.settings.MainSettings}, action=0, flags=8, keyCode=117, scanCode=125, metaState=4390912, repeatCount=0, policyFlags=1644167169
WindowManager: interceptKeyTq keycode=30 interactive=true keyguardActive=false policyFlags=22000001
11-17 06:45:58.220 +0000   495   594 D WindowManager: interceptKeyTi keyCode=30 down=true repeatCount=0 keyguardOn=false mHomePressed=false canceled=false
11-17 06:45:58.221 +0000   495   594 I ActivityManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=acr.browser.barebones/acr.browser.lightning.activity.MainActivity sel=act=android.intent.action.MAIN cat=[android.intent.category.APP_BROWSER]}} from uid 1000
11-17 06:45:58.222 +0000   495   594 E ActivityManager: getPackageFerformanceMode--ComponentInfo{acr.browser.barebones/acr.browser.lightning.activity.MainActivity}----acr.browser.barebones
11-17 06:45:58.223 +0000   495   594 E ActivityManager: getPackageFerformanceMode--ComponentInfo{acr.browser.barebones/acr.browser.lightning.activity.MainActivity}----acr.browser.barebones
11-17 06:45:58.229 +0000   495  1580 E ActivityManager: getPackageFerformanceMode--ComponentInfo{acr.browser.barebones/acr.browser.lightning.activity.MainActivity}----acr.browser.barebones

最终决定在 ActivityManagerService.java中埋 LOG.

Log.e(TAG, Log.getStackTraceString(new Throwable()));      \\ 获取线程所使用过的堆栈信息

11-17 07:01:06.003 +0000   496   595 D WindowManager: interceptKeyTq keycode=30 interactive=true keyguardActive=false policyFlags=22000001
11-17 07:01:06.003 +0000   496   594 D WindowManager: interceptKeyTi keyCode=30 down=true repeatCount=0 keyguardOn=false mHomePressed=false canceled=false
11-17 07:01:06.004 +0000   496   594 I ActivityManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=acr.browser.barebones/acr.browser.lightning.activity.MainActivity sel=act=android.intent.action.MAIN cat=[android.intent.category.APP_BROWSER]}} from uid 1000
11-17 07:01:06.012 +0000   496   594 E ActivityManager: getPackageFerformanceMode--ComponentInfo{acr.browser.barebones/acr.browser.lightning.activity.MainActivity}----acr.browser.barebones
11-17 07:01:06.012 +0000   496   594 E ActivityManager: java.lang.Throwable
11-17 07:01:06.012 +0000   496   594 E ActivityManager:         at com.android.server.am.ActivityManagerService.getFrontActivityPerformanceModeLocked(ActivityManagerService.java:4170)
11-17 07:01:06.012 +0000   496   594 E ActivityManager:         at com.android.server.am.ActivityStack.adjustPackagePerformanceMode(ActivityStack.java:5384)
11-17 07:01:06.012 +0000   496   594 E ActivityManager:         at com.android.server.am.ActivityStack.resumeTopActivityInnerLocked(ActivityStack.java:2385)
11-17 07:01:06.012 +0000   496   594 E ActivityManager:         at com.android.server.am.ActivityStack.resumeTopActivityUncheckedLocked(ActivityStack.java:2255)
11-17 07:01:06.012 +0000   496   594 E ActivityManager:         at com.android.server.am.ActivityStackSupervisor.resumeFocusedStackTopActivityLocked(ActivityStackSupervisor.java:2094)
11-17 07:01:06.012 +0000   496   594 E ActivityManager:         at com.android.server.am.ActivityStarter.startActivityUnchecked(ActivityStarter.java:1238)
11-17 07:01:06.012 +0000   496   594 E ActivityManager:         at com.android.server.am.ActivityStarter.startActivity(ActivityStarter.java:995)
11-17 07:01:06.012 +0000   496   594 E ActivityManager:         at com.android.server.am.ActivityStarter.startActivity(ActivityStarter.java:572)
11-17 07:01:06.012 +0000   496   594 E ActivityManager:         at com.android.server.am.ActivityStarter.startActivityLocked(ActivityStarter.java:278)
11-17 07:01:06.012 +0000   496   594 E ActivityManager:         at com.android.server.am.ActivityStarter.startActivityMayWait(ActivityStarter.java:817)
11-17 07:01:06.012 +0000   496   594 E ActivityManager:         at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:4557)
11-17 07:01:06.012 +0000   496   594 E ActivityManager:         at android.app.ContextImpl.startActivityAsUser(ContextImpl.java:887)
11-17 07:01:06.012 +0000   496   594 E ActivityManager:         at android.app.ContextImpl.startActivityAsUser(ContextImpl.java:861)
11-17 07:01:06.012 +0000   496   594 E ActivityManager:         at com.android.server.policy.PhoneWindowManager.startActivityAsUser(PhoneWindowManager.java:4170)
11-17 07:01:06.012 +0000   496   594 E ActivityManager:         at com.android.server.policy.PhoneWindowManager.interceptKeyBeforeDispatching(PhoneWindowManager.java:3819)
11-17 07:01:06.012 +0000   496   594 E ActivityManager:         at com.android.server.wm.InputMonitor.interceptKeyBeforeDispatching(InputMonitor.java:466)
11-17 07:01:06.012 +0000   496   594 E ActivityManager:         at com.android.server.input.InputManagerService.interceptKeyBeforeDispatching(InputManagerService.java:1999)

直接获取到是从PhoneWindowManager.java中的interceptKeyBeforeDispatching起作用.

最终解法是卡了B条件.Cover住了这个问题

--- a/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
-            if (kcm.isPrintingKey(keyCode)) {
+            if (kcm.isPrintingKey(keyCode) && keyCode != KeyEvent.KEYCODE_B) {

若是有技术大牛对此有更深刻的理解 ,还希望指点一二.

本文标签: 屏蔽快捷操作功能android