Android 11 系统新增自定义按键事件

在 Android 项目开发中,有时需要新增自定义按键,现以新增 AI 键为例,介绍 Android 11 如何新增自定义按键事件。

1、内核新增输入事件代码 KEY_AI 并在设备驱动上报

(1)在 kernel4.14/include/uapi/linux/input-event-codes.h 新增输入事件代码 KEY_AI:

--- a/kernel4.14/include/uapi/linux/input-event-codes.h
+++ b/kernel4.14/include/uapi/linux/input-event-codes.h
@@ -337,6 +337,9 @@
 #define KEY_MICMUTE		248
+#define KEY_AI             249

(2)在设备驱动中上报 KEY_AI 事件到 input 子系统


static void input_ai_key(void)
{
	input_report_key(tpd->dev, KEY_AI, 1);
	input_sync(tpd->dev);
	input_report_key(tpd->dev, KEY_AI, 0);
	input_sync(tpd->dev);
}

2、frameworks 把输入事件代码转换为 keycode

(1)frameworks/native/include/android/keycodes.h:

--- a/frameworks/native/include/android/keycodes.h
+++ b/frameworks/native/include/android/keycodes.h
@@ -776,8 +776,11 @@ enum {
-    AKEYCODE_PROFILE_SWITCH = 288
+    AKEYCODE_PROFILE_SWITCH = 288,
+    AKEYCODE_AI = 289,

(2)frameworks/native/include/input/InputEventLabels.h:

 --- a/frameworks/native/include/input/InputEventLabels.h
+++ b/frameworks/native/include/input/InputEventLabels.h
@@ -328,7 +328,8 @@ static const InputEventLabel KEYCODES[] = {
     DEFINE_KEYCODE(PROFILE_SWITCH),-
+    DEFINE_KEYCODE(AI),

(3)frameworks/base/core/res/res/values/attrs.xml:

--- a/frameworks/base/core/res/res/values/attrs.xml
+++ b/frameworks/base/core/res/res/values/attrs.xml
@@ -1931,6 +1931,8 @@
         <enum name="KEYCODE_PROFILE_SWITCH" value="288" />
+        <enum name="KEYCODE_AI" value="289" />	
     </attr>

 (4)在 frameworks/base/data/keyboards/Generic.kl 新增输入事件和 keycode 的映射:

--- a/frameworks/base/data/keyboards/Generic.kl
+++ b/frameworks/base/data/keyboards/Generic.kl
@@ -247,6 +247,9 @@
 key 226   HEADSETHOOK
+key 249   AI

(5)在 frameworks/base/core/java/android/view/KeyEvent.java 中新增 keycode 并修改 isSystem() 和 isWakeKey():

--- a/frameworks/base/core/java/android/view/KeyEvent.java
+++ b/frameworks/base/core/java/android/view/KeyEvent.java
@@ -824,13 +824,16 @@ public class KeyEvent extends InputEvent implements Parcelable {
     public static final int KEYCODE_PROFILE_SWITCH = 288;	
+	 public static final int KEYCODE_AI = 289;
 
-    public static final int LAST_KEYCODE = KEYCODE_PROFILE_SWITCH;
+    public static final int LAST_KEYCODE = KEYCODE_AI;
 
@@ -1965,6 +1968,8 @@ public class KeyEvent extends InputEvent implements Parcelable {
             case KeyEvent.KEYCODE_SYSTEM_NAVIGATION_RIGHT:
+	    	 case KeyEvent.KEYCODE_AI:
                 return true;
         }
 
@@ -1981,6 +1986,8 @@ public class KeyEvent extends InputEvent implements Parcelable {
             case KeyEvent.KEYCODE_WAKEUP:
+            case KeyEvent.KEYCODE_AI:
                 return true;
         }
         return false;

(6)在 PhoneWindowManager 类中可以对 KEYCODE_AI 进行处理

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

--- a/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -4038,7 +4038,23
 @@ public class PhoneWindowManager extends AbsPhoneWindowManager implements WindowM
                 break;
             }
+            case KeyEvent.KEYCODE_AI: {
+                if(down) {
+		             Log.d(TAG, "KEYCODE_AI");
                     // 此处可发送自定义 broadcast
+                }
+                break;
+            }
             case KeyEvent.KEYCODE_F1: {
                 if(down) {

完成上述步骤就新增了 AI 按键的输入事件 KEYCODE_AI,Andorid 应用程序可以进一步对其进行处理。

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值