配好键值后在override/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java

相机按键,键值KeyEvent.KEYCODE_CAMERA

原本没有就加上这个case

case KeyEvent.KEYCODE_CAMERA:{//cameraif(down && !flag && mHotKeyEnable && !getCurrentActivityName().equals("com.freeme.factory.input.KeyboardTest") && !getCurrentActivityName().equals("com.mediatek.camera.CameraLauncher")){Intent intent;if (keyguardActive) {intent = new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE);} else {intent = new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA);}startActivityAsUser(intent, UserHandle.CURRENT_OR_SELF);}if(down && !flag && mHotKeyEnable && !getCurrentActivityName().equals("com.freeme.factory.input.KeyboardTest") ){sendBC("android.intent.action.CAMERA.down");}if(event.getAction() == KeyEvent.ACTION_UP && !flag && mHotKeyEnable && !getCurrentActivityName().equals("com.freeme.factory.input.KeyboardTest")){sendBC("android.intent.action.CAMERA.up");}break ;}

这里面需要用到的布尔值,在case前面找个地方定义下,这个mHotKeyEnable 看需求情况无所谓的

KeyguardManager mKeyguardManager = (KeyguardManager)mContext.getSystemService(Context.KEYGUARD_SERVICE);boolean flag = mKeyguardManager.inKeyguardRestrictedInputMode();ContentResolver mContentResolver=mContext.getContentResolver();boolean mHotKeyEnable = Settings.System.getInt(mContentResolver, FreemeSettings.System.FREEME_HOT_KEY_ENABLED, 0) == 1;

需要用到的方法一个是获取当前活动名,一个是发广播

private String getCurrentActivityName() {ActivityManager am = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1);ComponentName componentInfo = taskInfo.get(0).topActivity;return componentInfo.getClassName();}private void sendBC(String action){Intent intent = new Intent();intent.setAction(action);mContext.sendBroadcast(intent);}

如果里面有些类包没导入要记得import

keyguardActive并不是锁屏,锁屏是flag判断的,而现在写的这个一开始就加了判断!flag就是不在锁屏状态

按键测试有些特殊按键无法使用的bug以及监听不到特殊按键,总结

原来是焦点问题,我们注意View中有监听事件,Activity也有监听事件,两个类的监听事件有些是相同 的,想想其实原因很简单,

如果在Activity用View画图,你在View里添加监听事件,在Activity里面也添加相同监听事情的话,例如都添加onKeyDown事件,

这样当你按下某个键的时候,系统 就不知道你需要调用哪个方法了,不知道用哪个监听 了,

所以这就关系到焦点问题,谁拥有焦点,就调用谁的监听事件。

要监听power键需要换成result |= ACTION_PASS_TO_USER;,原本是

result &= ~ACTION_PASS_TO_USER;

所以下面那个工模按键测试的其实只需要换成result |= ACTION_PASS_TO_USER这句就行。

这个就是result = result | ACTION_PASS_TO_USER,在这些keycode的case break之后整个switch循环结束后最底下就会返回的result ,

如果要监听power键的话

原来的result &= ~ACTION_PASS_TO_USER;只能是第一次有效果,就第一次result是可以给到ACTION_PASS_TO_USER的,但后面就没了,而工模测试项只需要这一次就够了,所以不要紧,其实这句话就是拦截power键不给应用下发的,第一次其实就是应用可用,但是之后就被拦截了,可以理解为ACTION_PASS_TO_USER 为1,那么位反~就是0,在&一下,只要有0,&的都是0,所以最后result为0;就被拦截了。那么应用无法在正常监听这个键。而result |= ACTION_PASS_TO_USER,那肯定都是1,

工模按键测试OK键,

case KeyEvent.KEYCODE_DPAD_CENTER:{if(down && !flag && getCurrentActivityName().equals("com.freeme.factory.input.KeyboardTest")){result &= ~ACTION_PASS_TO_USER;}break;}

result &= ~ACTION_PASS_TO_USER;这句话非常重要!ok键本来就是配合上下左右的,如果不加这个,在工模按键测试中不按上下左右之前是可以按ok键消掉的,但是动了方向键之后,ok键就无法消掉了,点击ok键会执行本来ok改执行的,不只有PhoneWindowManager.java调用了这些键的功能,这属于基础按键。加上这句之后就相当于,在按键测试的时候屏蔽掉原来所在应用的OK的功能了。到了按键测试就用里面的ok功能。

同理挂断键 ENDCALL

case KeyEvent.KEYCODE_ENDCALL: {if(down && !flag && getCurrentActivityName().equals("com.freeme.factory.input.KeyboardTest")){result &= ~ACTION_PASS_TO_USER;return 0;}

注意,这边源码中case下第一句就是

result &= ~ACTION_PASS_TO_USER;

要把这句删掉,不然是没有效果的,

后面就是加这个挂断电话的功能,以及需要亮灭屏,原来只能灭屏不能亮,改的和POWER一样就行,这文件里就有POWER的功能代码。

源码的ENDCALL下面down后的功能就已经写好了,我们只需要加个else,但是得有个if,逻辑就是如果处于打电话状态,那么这个按键就是挂断键,那如果不是处于电话状态那就是power键

参考power键的代码很简单

cancelPendingAccessibilityShortcutAction();// result &= ~ACTION_PASS_TO_USER;isWakeKey = false; // wake-up will be handled separately

第二句得注释掉,不然还是无法成功,也就是说一个KeyEvent不允许出现两次

主要是

TelephonyManager telephonyManager = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);if(telephonyManager.getCallState() != 0) {

然后这里面接他本来的功能

然后最底下else接power的功能

}else{if (down) {interceptPowerKeyDown(event, interactive);} else {interceptPowerKeyUp(event, interactive, canceled);}}

源码上这个result是int类型,给的注释是

// When the device is interactive or the key is injected pass the

// key to the application.

result = ACTION_PASS_TO_USER;

这个意思我的理解就是,当这个应用当前需要拦截这个key用来自己的功能,那么就把这个焦点给到这个应用。不能在同一个事件重复。是框架层高于应用层。

增加按键功能(Camera按键)。确认OK键和挂断ENDCALL能在工模按键测试时正常使用。挂断键日常是电源键,监听power键相关推荐

  1. Android 监听Home键按键事件

    Android 监听Home键按键事件 标签(空格分隔):Android Home键 在Android开发中有很多按键事件需要在App中捕获从而做出一些针对性的操作,例如返回键,音量键等都可以直接在d ...

  2. 在Android中实现监听 返回键,主键,菜单键

    一.监听 返回键 onKeyDown方法和onBackPressed方法 onKeyDown: 是当某个按键被按下是触发.所以也有人在点击返回键的时候去执行该方法来做判断.(该方法只是android ...

  3. android注册广播监听按钮,Android实现广播监听HOME键操作

    先写了个Service,在服务中通过广播来监听HOME键操作: public class HomeService extends Service{ private MonitoHomeReceiver ...

  4. Android下监听返回键、home键、任务键

    1.监听返回键 @Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYC ...

  5. Android 如何监听返回键,弹出一个退出对话框

    Android 如何监听返回键点击事件,并创建一个退出对话框, 防止自己写的应用程序不小心点击退出键而直接退出.自己记录下这个简单的demo,备用. 注:如下代码当时是从网上copy过来的,现在忘了它 ...

  6. Android 监听Home键、Back键、多任务键最新解决方法

    前言 在开发中,我们可以经常看金融银行之类APP,退到后台都会给出提示,提高安全性.实现这种功能就需要去监听系统的按键操作,最常用的就是监听Back键.Home键和多任务键. 但是Android系统默 ...

  7. react 监听组合键_投资组合中需要的5个React项目

    react 监听组合键 You've put in the work and now you have a solid understanding of the React library. 您已经完 ...

  8. Android 监听Home键

    2019独角兽企业重金招聘Python工程师标准>>> 游戏需要统计用户退出游戏是按的返回键还是home,因为返回键是自己cocos2dx做的监听,所以这里说一下android Ac ...

  9. Android 监听home键(android:launchMode=singleTask 与 onNewIntent(Intent intent) 的用法

    android:launchMode="singleTask" 和 onNewIntent(Intent intent)两个特性,现总结一下经验: android:launchMo ...

最新文章

  1. JSONEasy的用法(JSONDateHandler)
  2. 复习-css列表和表格相关属性
  3. 轻量级3d模型查看器_你该试试这样来管理你的3D资产了 Connecter
  4. java中的lombok_如何在Java中使用Lombok删除样板设置器吸气剂
  5. Oracle15001,Oracle11gR2RAC环境DBCA创建数据库报错ORA-15055ORA-15001
  6. string中concat_JavaScript中带示例的String concat()方法
  7. 活动安排问题的 动态规划和贪心算法
  8. 为什么C语言仍然占据统治地位?
  9. Python基础入门知识点——Python中的异常
  10. 一道简单的编程题,不过您做对了吗?
  11. 企业进销存管理系统 email_移动进销存让企业高效进行汽车配件管理
  12. JSP访问Spring中的bean
  13. gamit运行时候报错:wrod too long
  14. 车联网大数据框架_车联网大数据平台架构设计-系统总体架构
  15. Android版本控制软件之SVN
  16. 聊聊运营商对UDP的QoS限制和应对
  17. KMPlayer使用方法
  18. win7安不了python_win7下安装python失败问题
  19. 骁龙778g4g和5g区别
  20. RED5的API介紹-4

热门文章

  1. 对话浙大博导吴飞:人工智能的前世今生
  2. ​Interspeech 2022 | 探索非自回归跨语言语音合成中的音色解耦问题
  3. 2021小红书国际妇女节营销报告
  4. 网络成瘾临床诊断标准 英语_在现代生活中,技术成瘾已成为标准
  5. 安智市场apk 签名问题 : 找不到xxx.jks的证书链。meimei.jks必须引用包含私有密钥和相应的公共密钥证书链的有效密钥库密钥条目。
  6. Deque接口实现栈功能
  7. nginx日志文件管理【nginx】
  8. 基于FPGA状态机设计实现EtherCAT从站
  9. 365天英语口语学习_18,挂断电话
  10. 基于SSM的智能车库管理系统的设计与实现