当前位置: 首页 > news >正文

安卓11修改power按键功能

客户需要把power键的短按休眠功能去除,并且把长按功能改成直接关机,我们先分析系统framework层处理按键的代码:
interceptKeyBeforeQueueing
power按键上来都会直接走这里,我们找到power按键处理的地方如下:

    case KeyEvent.KEYCODE_POWER: {EventLogTags.writeInterceptPower(KeyEvent.actionToString(event.getAction()),mPowerKeyHandled ? 1 : 0, mPowerKeyPressCounter);// Any activity on the power button stops the accessibility shortcutcancelPendingAccessibilityShortcutAction();result &= ~ACTION_PASS_TO_USER;isWakeKey = false; // wake-up will be handled separatelyif (down) {interceptPowerKeyDown(event, interactive);} else {interceptPowerKeyUp(event, interactive, canceled);}break;}看到这里就明白了,所以短按必定是在interceptPowerKeyUp里处理完成的,因为长按是在按住不放的情况下出来的,所以长按必定是在interceptPowerKeyDown这里处理的。我们先把短按屏蔽掉:
            private void interceptPowerKeyUp(KeyEvent event, boolean interactive, boolean canceled) {final boolean handled = canceled || mPowerKeyHandled;mScreenshotChordPowerKeyTriggered = false;cancelPendingScreenshotChordAction();cancelPendingPowerKeyAction();if (!handled) {if ((event.getFlags() & KeyEvent.FLAG_LONG_PRESS) == 0) {// Abort possibly stuck animations only when power key up without long press case.mHandler.post(mWindowManagerFuncs::triggerAnimationFailsafe);}// Figure out how to handle the key now that it has been released.mPowerKeyPressCounter += 1;final int maxCount = getMaxMultiPressPowerCount();final long eventTime = event.getDownTime();if (mPowerKeyPressCounter < maxCount) {// This could be a multi-press.  Wait a little bit longer to confirm.// Continue holding the wake lock.Message msg = mHandler.obtainMessage(MSG_POWER_DELAYED_PRESS,interactive ? 1 : 0, mPowerKeyPressCounter, eventTime);msg.setAsynchronous(true);mHandler.sendMessageDelayed(msg, ViewConfiguration.getMultiPressTimeout());return;}// No other actions.  Handle it immediately.//    powerPress(eventTime, interactive, mPowerKeyPressCounter);这句去掉就没有短按了}// Done.  Reset our state.finishPowerKeyPress();
}

下面就改长按的功能,找到
private void interceptPowerKeyDown(KeyEvent event, boolean interactive)
看到这个方法里有如下内容:

                 // When interactive, we're already awake.// Wait for a long press or for the button to be released to decide what to do.if (hasLongPressOnPowerBehavior()) {if ((event.getFlags() & KeyEvent.FLAG_LONG_PRESS) != 0) {powerLongPress();} else {Message msg = mHandler.obtainMessage(MSG_POWER_LONG_PRESS);//长按默认走这里,通过发送MSG_POWER_LONG_PRESS消息到handler处理msg.setAsynchronous(true);mHandler.sendMessageDelayed(msg,ViewConfiguration.get(mContext).getDeviceGlobalActionKeyTimeout());if (hasVeryLongPressOnPowerBehavior()) {Message longMsg = mHandler.obtainMessage(MSG_POWER_VERY_LONG_PRESS);longMsg.setAsynchronous(true);mHandler.sendMessageDelayed(longMsg, mVeryLongPressTimeout);}}}这里接收长按消息处理         private class PolicyHandler extends Handler {@Overridepublic void handleMessage(Message msg) {switch (msg.what) {case MSG_POWER_LONG_PRESS:powerLongPress();break;最终长按都会到这里处理powerLongPress()直接这样改就能实现把显示关机重启对话框改为直接关机功能@@ -1306,14 +1307,21 @@private void powerLongPress() {final int behavior = getResolvedLongPressOnPowerBehavior();
+         Log.i("fan","behavior is"+behavior);switch (behavior) {case LONG_PRESS_POWER_NOTHING:break;case LONG_PRESS_POWER_GLOBAL_ACTIONS:mPowerKeyHandled = true;
-                performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, false,
-                        "Power - Long Press - Global Actions");
-                showGlobalActionsInternal();
+             performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, false,
+                        "Power - Long Press - Shut Off");
+                sendCloseSystemWindows(SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS);
+                mWindowManagerFuncs.shutdown(behavior == LONG_PRESS_POWER_SHUT_OFF);
+               // performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, false,
+                     //   "Power - Long Press - Global Actions");
+                //showGlobalActionsInternal();break;case LONG_PRESS_POWER_SHUT_OFF:case LONG_PRESS_POWER_SHUT_OFF_NO_CONFIRM:

如果要去除短按2次进入camera,还是在这里修改 private void

interceptPowerKeyDown(KeyEvent event, boolean interactive) {找到如下代码屏蔽即可:/*这里屏蔽短按打开camera功能 GestureLauncherService gestureService = LocalServices.getService(GestureLauncherService.class);boolean gesturedServiceIntercepted = false;if (gestureService != null) {gesturedServiceIntercepted = gestureService.interceptPowerKeyDown(event, interactive,mTmpBoolean);if (mTmpBoolean.value && mRequestedOrGoingToSleep) {mCameraGestureTriggeredDuringGoingToSleep = true;}}
*/// Inform the StatusBar; but do not allow it to consume the event.sendSystemKeyToStatusBarAsync(event.getKeyCode());schedulePossibleVeryLongPressReboot();// If the power key has still not yet been handled, then detect short// press, long press, or multi press and decide what to do.mPowerKeyHandled = hungUp || mScreenshotChordVolumeDownKeyTriggered|| mA11yShortcutChordVolumeUpKeyTriggered /*|| gesturedServiceIntercepted*/ //这里屏蔽|| handledByPowerManager;

相关文章:

  • 【脚本】图片-音视频-压缩文件处理
  • 【android开发-17】android中SQLite数据库CRUD详细介绍
  • 1826_ChibiOS的OSLIB中的二值信号量
  • 数据分析基础之《matplotlib(4)—柱状图》
  • 【HTML语法】
  • 深度学习——第3章 Python程序设计语言(3.5 Python类和对象)
  • RabbitMQ创建新用户,并给用户添加角色和授权
  • 报错:merge sql error, dbType mysql, sql : select...
  • 点击el-tree小三角后去除点击后的高亮背景样式,el-tree样式修改
  • block-recurrent-transformer-pytorch 学习笔记
  • Mybatis之动态SQL
  • 基于SSM的医院交互系统的设计与实现
  • Oracle官网 账号及密码 -- 笔记
  • 测试新手百科:Postman简介、安装、入门使用方法详细攻略!
  • Hadoop3.x完全分布式环境搭建Zookeeper和Hbase
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • 5、React组件事件详解
  • Babel配置的不完全指南
  • create-react-app项目添加less配置
  • Docker下部署自己的LNMP工作环境
  • echarts花样作死的坑
  • EOS是什么
  • JavaScript-Array类型
  • Material Design
  • Redis字符串类型内部编码剖析
  • Ruby 2.x 源代码分析:扩展 概述
  • spring + angular 实现导出excel
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 通过几道题目学习二叉搜索树
  • 由插件封装引出的一丢丢思考
  • nb
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • ​TypeScript都不会用,也敢说会前端?
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (152)时序收敛--->(02)时序收敛二
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (二)linux使用docker容器运行mysql
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (译) 函数式 JS #1:简介
  • (译)2019年前端性能优化清单 — 下篇
  • (转)IOS中获取各种文件的目录路径的方法
  • (转载)hibernate缓存
  • .NET BackgroundWorker
  • .NET delegate 委托 、 Event 事件
  • .Net 基于IIS部署blazor webassembly或WebApi
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • .net对接阿里云CSB服务
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?
  • /dev下添加设备节点的方法步骤(通过device_create)