【问题标题】:Android KEYCODE_ENTER does not work from ServiceAndroid KEYCODE_ENTER 在服务中不起作用
【发布时间】:2020-08-19 14:22:58
【问题描述】:

我有一个在后台运行的 Android 服务,它接收来自 HAL 层的密钥输入。该服务应执行 DPAD 向上/向下/向右/向左/中心移动。

应用程序可以捕捉到 DPAD 方向,但不会自动使用。

同时,如果我尝试使用 adb shell input keyevent 注入相同的关键事件,它可以在应用程序内部工作,在它们被消耗和执行的意义上工作,如果我注入 DPAD 右,焦点转到右侧应用程序屏幕。

我的服务注入 keyevent 和 ADB 注入 keyevents 之间的实际区别是什么?我是否缺少任何权限?

这是我的服务代码:

private boolean sendKeyEvent(int keycode) {
        boolean bResult = false;
        InputManager im = InputManager.getInstance();
        if (im == null) {
            Log.e(TAG, "Input Manager not available.");
            return false;
        }
       
        KeyEvent evDown = new KeyEvent(1, new Date().getTime(), android.view.KeyEvent.ACTION_DOWN, keycode, 1);
        KeyEvent evUp = new KeyEvent(1, new Date().getTime(), android.view.KeyEvent.ACTION_UP, keycode, 1);

        Log.d(TAG, "sending: keycode: " + keycode);
        boolean retval = im.injectInputEvent(evDown, InputManager.INJECT_INPUT_EVENT_MODE_ASYNC);
        Log.d(TAG, "injectedInputEvent down returned with: " + retval);
        boolean retval2 = im.injectInputEvent(evUp, InputManager.INJECT_INPUT_EVENT_MODE_ASYNC);
        Log.d(TAG, "injectedInputEvent up returned with: " + retval2);
        return bResult = retval && retval2;
    }

服务实际上是用整个系统镜像构建的,所以可以添加任何权限。

谢谢。

【问题讨论】:

    标签: android adb


    【解决方案1】:

    目前我正在开发一个通过 adb 命令使用 keyevents 的应用程序,我遇到了这种情况,阅读了一些帖子,我发现我需要设置 INJECT_EVENT 权限。但是,此权限仅用于系统应用程序,因此,我解决此问题的方法是使用自定义密钥签署我的应用程序,这些密钥允许您的应用程序成为一种系统应用程序,请阅读 thisthis 到明白了。

    【讨论】:

    • 谢谢你。我实际上发现事件已成功注入,问题是应用程序没有使用我在提到的代码中添加的功能来使用这些输入。
    【解决方案2】:

    我设法通过复制我找到的hereadb shell input keyevent 的功能解决了这个问题。它现在完美运行。 代码如下:

    KeyEvent event = new KeyEvent(now, now, KeyEvent.ACTION_DOWN, keycode, 0, 0,
                                      KeyCharacterMap.VIRTUAL_KEYBOARD, 0, 0, 0);
    im.injectInputEvent(event, InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH);
    
    im.injectInputEvent(KeyEvent.changeAction(event, KeyEvent.ACTION_UP),
            InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH);
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-03
      • 2012-01-25
      • 1970-01-01
      • 2016-03-14
      相关资源
      最近更新 更多