在 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 应用程序可以进一步对其进行处理。