• 在PhoneWindowManagerjava中处理
  • 在InputDispatchercpp中处理

在Android开发中,我们通常需要对发往工厂的Android软件进行工厂测试;这其中就要去测试各个按键的功能,例如:测试HOME/BACK/MENU/POWER。但是问题在于:这些按键基本上都是有系统负责处理的,或者在系统处理了之后在向上分发的。也就是说,不论怎样系统都会对此类按键进行处理。
这里给出如下方法:

PhoneWindowManager.java中处理

frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java


// First we always handle the home key here, so applications
// can never break it, although if keyguard is on, we do let
// it handle it, because that gives us the correct 5 second
// timeout.
if (keyCode == KeyEvent.KEYCODE_HOME) {// If we have released the home key, and didn't do anything else// while it was pressed, then it is time to go home!if (!down) {cancelPreloadRecentApps();mHomePressed = false;if (mHomeConsumed) {mHomeConsumed = false;return -1;}if (canceled) {Log.i(TAG, "Ignoring HOME; event canceled.");return -1;}// If an incoming call is ringing, HOME is totally disabled.// (The user is already on the InCallUI at this point,// and his ONLY options are to answer or reject the call.)TelecomManager telecomManager = getTelecommService();if (telecomManager != null && telecomManager.isRinging()) {Log.i(TAG, "Ignoring HOME; there's a ringing incoming call.");return -1;}// Delay handling home if a double-tap is possible.if (mDoubleTapOnHomeBehavior != DOUBLE_TAP_HOME_NOTHING) {// just in casemHomeDoubleTapPending = true;mHandler.postDelayed(mHomeDoubleTapTimeoutRunnable,ViewConfiguration.getDoubleTapTimeout());return -1;}// deal with key.... beforeif (isTopActivityFactoryTool(win)) {Log.d(TAG,"factory tool return");return 0;}// deal with key.... endhandleShortPressOnHome();return -1;}// If a system window has focus, then it doesn't make sense// right now to interact with applications.WindowManager.LayoutParams attrs = win != null ? win.getAttrs() : null;if (attrs != null) {final int type = attrs.type;if (type == WindowManager.LayoutParams.TYPE_KEYGUARD_SCRIM|| type == WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG|| (attrs.privateFlags & PRIVATE_FLAG_KEYGUARD) != 0) {// the "app" is keyguard, so give it the keyreturn 0;}final int typeCount = WINDOW_TYPES_WHERE_HOME_DOESNT_WORK.length;for (int i=0; i<typeCount; i++) {if (type == WINDOW_TYPES_WHERE_HOME_DOESNT_WORK[i]) {// don't do anything, but also don't pass it to the appreturn -1;}}}// Remember that home is pressed and handle special actions.if (repeatCount == 0) {mHomePressed = true;if (mHomeDoubleTapPending) {mHomeDoubleTapPending = false;mHandler.removeCallbacks(mHomeDoubleTapTimeoutRunnable);handleDoubleTapOnHome();} else if (mLongPressOnHomeBehavior == LONG_PRESS_HOME_RECENT_SYSTEM_UI|| mDoubleTapOnHomeBehavior == DOUBLE_TAP_HOME_RECENT_SYSTEM_UI) {preloadRecentApps();}} else if ((event.getFlags() & KeyEvent.FLAG_LONG_PRESS) != 0) {if (!keyguardOn) {handleLongPressOnHome(event.getDeviceId());}}return -1;
}

其中
isTopActivityFactoryTool函数的实现方式

public boolean isTopActivityFactoryTool(WindowState win) {if(win != null){String topPackageName = win.getOwningPackage();if(("com.cp.packagename1".equals(topPackageName)|| "com.cp.packagename2".equals(topPackageName))){Log.d(TAG,"top activity is " + topPackageName);return true;}}return false;
}

在InputDispatcher.cpp中处理

frameworks/base/native/services/inputflinger/InputDispatcher.cpp

void InputDispatcher::notifyKey(const NotifyKeyArgs* args) {
#if DEBUG_INBOUND_EVENT_DETAILSALOGD("notifyKey - eventTime=%lld, deviceId=%d, source=0x%x, policyFlags=0x%x, action=0x%x, flags=0x%x, keyCode=0x%x, scanCode=0x%x,metaState=0x%x, downTime=%lld",args->eventTime, args->deviceId, args->source, args->policyFlags,args->action, args->flags, args->keyCode, args->scanCode,args->metaState, args->downTime);
#endifif (!validateKeyEvent(args->action)) {return;}uint32_t policyFlags = args->policyFlags;int32_t flags = args->flags;int32_t metaState = args->metaState;if ((policyFlags & POLICY_FLAG_VIRTUAL) || (flags &AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY)) {policyFlags |= POLICY_FLAG_VIRTUAL;flags |= AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY;}if (policyFlags & POLICY_FLAG_FUNCTION) {metaState |= AMETA_FUNCTION_ON;}policyFlags |= POLICY_FLAG_TRUSTED;int32_t keyCode = args->keyCode;if (metaState & AMETA_META_ON && args->action == AKEY_EVENT_ACTION_DOWN) {int32_t newKeyCode = AKEYCODE_UNKNOWN;if (keyCode == AKEYCODE_DEL) {newKeyCode = AKEYCODE_BACK;} else if (keyCode == AKEYCODE_ENTER) {newKeyCode = AKEYCODE_HOME;}if (newKeyCode != AKEYCODE_UNKNOWN) {AutoMutex _l(mLock);struct KeyReplacement replacement = {keyCode, args->deviceId};mReplacedKeys.add(replacement, newKeyCode);keyCode = newKeyCode;metaState &= ~AMETA_META_ON;}} else if (args->action == AKEY_EVENT_ACTION_UP) {// In order to maintain a consistent stream of up and down events, check to see if the key// going up is one we've replaced in a down event and haven't yet replaced in an up event,// even if the modifier was released between the down and the up events.AutoMutex _l(mLock);struct KeyReplacement replacement = {keyCode, args->deviceId};ssize_t index = mReplacedKeys.indexOfKey(replacement);if (index >= 0) {keyCode = mReplacedKeys.valueAt(index);mReplacedKeys.removeItemsAt(index);metaState &= ~AMETA_META_ON;}}KeyEvent event;event.initialize(args->deviceId, args->source, args->action,flags, keyCode, args->scanCode, metaState, 0,args->downTime, args->eventTime);mPolicy->interceptKeyBeforeQueueing(&event, /*byref*/ policyFlags);bool needWake;{ // acquire lockmLock.lock();if (shouldSendKeyToInputFilterLocked(args)) {mLock.unlock();policyFlags |= POLICY_FLAG_FILTERED;if (!mPolicy->filterInputEvent(&event, policyFlags)) {return; // event was consumed by the filter}mLock.lock();}int32_t repeatCount = 0;//add your control code hereif(false){//origin source code}else{//your self source code}#ifdef CONTROL_KEY_CODE//your self source code#else//origin source doce#endifKeyEntry* newEntry = new KeyEntry(args->eventTime,args->deviceId, args->source, policyFlags,args->action, flags, keyCode, args->scanCode,metaState, repeatCount, args->downTime);needWake = enqueueInboundEventLocked(newEntry);mLock.unlock();} // release lockif (needWake) {mLooper->wake();}
}

详细的添加规则可以根据自己需求,伪代码如下所示

        //add your control code hereif(false){//origin source code}else{//your self source code}#ifdef CONTROL_KEY_CODE//your self source code#else//origin source doce#endif

有关InputDispatch的处理参见 Android 中处理POWER/HOME流程

Android 屏蔽Power键 Home键相关推荐

  1. android4.2 拦截power键,Android 屏蔽Power键 Home键

    2014-04-18 17:22 1557人阅读 评论(0) 收藏 举报 分类: Android(46) 版权声明:本文为博主原创文章,未经博主允许不得转载. 最近正在处理工厂测试的功能,里面有个功能 ...

  2. android 屏蔽home键操作

    1.重写onAttachedToWindow public void onAttachedToWindow() { this.getWindow().setType(WindowManager.Lay ...

  3. android 9.0 10.0 去掉音量键+Power键组合键的屏幕截图功能

    1.概述 在10.0的系统中由WindowManagerService这个系统服务来循环读取窗口获取的消息(包括按下,弹起,双击,单击等)然后分发到各个类接收处理这些消息,在这个过程中PhoneWin ...

  4. 直播源码开发,Android 屏蔽返回键(后退键)

    直播源码开发,Android 屏蔽返回键(后退键) 方案一 在Activity中重写onBackPressed方法(推荐使用). @Override public void onBackPressed ...

  5. android怎么模拟返回,Android中障蔽返回键,HOME键以及模拟HOME键返回效果的方法...

    Android中屏蔽返回键,HOME键以及模拟HOME键返回效果的方法 在Android开发中,有时需要屏蔽一些实体的按键,如HOME键,返回键等实体的按键,实现的方法如下. 1. 屏蔽实体按键 屏蔽 ...

  6. Android 关于长按back键退出应用程序的实现

    Android 关于长按back键退出应用程序的实现 最近在做一个Android上的应用,碰到一个问题就是如何实现长按back键退出应用程序.在网上查找了很多资料,发现几乎没有这样的实现,大部分在处理 ...

  7. android动态加home,Android 解决监听home键的几种方法

    Android 解决监听home键的几种方法 前言: 以下两种方法可以完美解决监听back键,home键,多任务键(最近任务键). 一.使用注册广播监听home键.多任务键 演示图 创建一个广播代码如 ...

  8. Android 禁用电源键音量键与模拟

    /base/services/core/java/com/android/server/policy/PhoneWindowManager.java 模拟 在PhoneWindowManager中注册 ...

  9. android设置返回按钮无效,Android onKeyDown监听返回键无效的解决办法

    Android onKeyDown监听返回键无效的解决办法 当我们的Activity继承了TabActivity,在该类中重写onKeyDown是监听不到返回键的, 具体解决方法如下: 重写dispa ...

  10. android获取spinner的值_在Android的Spinner中实现键值对的正确方法是什么

    这是在Android中为Spinner实现键值对的正确方法吗? package com.mypackage import android.app.Activity; import android.os ...

最新文章

  1. BERT, ELMo, GPT-2: 这些上下文相关的表示到底有多上下文化?
  2. ISA系列之ISA Server 2004 中的新增功能--利用多个网络
  3. 【转】性能监控 -- 应用服务器常见监控指标
  4. 【费用流】【线性规划】志愿者招募(luogu 3980)
  5. 国王游戏(贪心 + 高精度乘法 + 高精度除法 + 高精度比较大小)
  6. 图形化升级单机oracle 11.2.0.1 到 11.2.0.4
  7. Hadoop学习之路(二十七)MapReduce的API使用(四)
  8. 一个服务器多个网站收录效果,8个优化小技巧快速提高网站收录
  9. 在recovery下挂载/system以使用adb
  10. 手把手带你了解Spark作业“体检报告” --Spark UI
  11. dede php低版本出现500错误,织梦后台生成文章提示500错误怎么办
  12. LED护眼灯真的可以护眼吗?2022专业护眼台灯品牌排行榜
  13. 设置CPU频率和CPU运行核心数
  14. Multinomial Logit Model (MNL) 模型R语言nnet包multinom函数实现实例
  15. java使用mybatis一次性插入多条数据
  16. C++ 11 14 RAII经典用法
  17. 避 孕药熟知的几种负面影响
  18. 《操作系统》2022年期末A卷
  19. python省略号怎么打_打中一次赚一次?手把手教你打新债
  20. FLTK 重写Fl_Button回调

热门文章

  1. 最新的 iOS 申请证书与发布流程 2016
  2. 元素化学期末(考点)整理
  3. 陈天桥的大脑在孕育什么新传奇(转)
  4. 使用Linux修复Windows PC的10种最聪明的方法
  5. 百合网推试爱机器人,人工智能+婚恋的起点?
  6. 阿里云盘 手动获取token教程
  7. 可以自学计算机考证吗
  8. 十大保养方法让你对汽车保养更加得心应手
  9. Shiro源码分析(二)——获取Subject
  10. 通过Excel对各个商品的销售分析