如何在 AOSP 13 中映射另一个用于后退导航的键码?

How to map another keycode for back navigation in AOSP 13?

提问人:Margish thumar 提问时间:11/17/2023 更新时间:11/19/2023 访问量:54

问:

我使用的是 AOSP 13 源代码。

  • 通过 adb shell 进行回操作

adb shell input keyevent 4

4 是背面的键码

我想通过键代码 141 映射后导航,以便我可以使用上面的命令返回为

adb shell input keyevent 141

这可能吗?

android android-source android-framelayout

评论

0赞 Rajat Gupta 11/18/2023
根据 Android 的 Keyevent.java,keyevent 141 在内部映射到 F11 键。您仍然可以覆盖 keyevent,检查 141 并注入 back 事件。cs.android.com/android/platform/superproject/+/......
0赞 Margish thumar 11/18/2023
@RajatGupta我想将其应用于整个系统而不是任何特定应用程序,您能否提供一些详细信息,我如何覆盖 keyevent,我必须查看哪些特定文件才能查看 AOSP 源代码?我查看了PhoneWindowManager.java,发现所有关键事件都是从那里处理的。

答:

0赞 Margish thumar 11/19/2023 #1

我找到了一个解决方案。

  • 由于键码 141 映射到 frameworks/base/core/java/android/view/KeyEvent 中的KEYCODE_F11.java

  • 需要处理 frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager 中KEYCODE_F11的输入事件.java

  • 导入文件

import android.content.Context;
import android.os.SystemClock;
import android.view.InputEvent;
import android.view.KeyEvent;
import com.android.server.LocalServices;
import com.android.server.input.InputManagerService;
import android.hardware.input.InputManager;
  • 在函数 interceptKeyBeforeQueueing() 中,有一个 swhitch 大小写,其中添加了 KEYCODE_F11 的大小写。

// Handle special keys.
         switch (keyCode) {
+           case KeyEvent.KEYCODE_F11:
+               long now = SystemClock.uptimeMillis();
+               if (down)
+               {
+                       // Inject a key down event
+                       KeyEvent downEvent = new KeyEvent(now, now, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK, 0);
+                       InputManager.getInstance().injectInputEvent(downEvent, InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH);
+               }
+               else
+               {
+                       // inject a key up event
+                       KeyEvent upEvent = new KeyEvent(now, now, KeyEvent.ACTION_UP, KeyEvent.KEYCODE_BACK, 0);
+                       InputManager.getInstance().injectInputEvent(upEvent, InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH);
+               }
+               break;
             case KeyEvent.KEYCODE_BACK: {
                 if (down) {
                     mBackKeyHandled = false;