admin管理员组文章数量:1566602
首先说一下,目前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 如何屏蔽 Win+Keyboard 实现快捷操作功能 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dianzi/1725720352a1038310.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论