【问题标题】:Listening to key press events blocks the keys from working监听按键事件会阻止按键工作
【发布时间】:2018-12-22 00:31:31
【问题描述】:

我是 android 新手,我正在制作一个应用程序,该应用程序将监听连续的音量增大和音量减小按键并振动模式。

我已经尝试使用 dispatchKeyEvent() 并且它可以检测到音量的上下变化,但它会阻止用户更改音量。

public boolean dispatchKeyEvent(KeyEvent event) {
    int action = event.getAction();
    int keyCode = event.getKeyCode();
    switch (keyCode) {
        case KeyEvent.KEYCODE_VOLUME_UP:
            if (action == KeyEvent.ACTION_DOWN) {
                System.out.println("UP"); // I know i can use Log but this is quicker to type
            }
            return true;
        case KeyEvent.KEYCODE_VOLUME_DOWN:
            if (action == KeyEvent.ACTION_DOWN) {
                System.out.println("DOWN");
            }
            return true;
        default:
            return super.dispatchKeyEvent(event);
    }
}

此外,我希望能够在屏幕关闭(并且应用程序在后台)时执行此操作,但显然服务无法与关键事件交互。

我到处都找到了非常矛盾的答案;我之前使用的一个应用程序在后台播放声音,屏幕关闭并且连续按了3次电源按钮,但是这里的许多问题都有类似于“不可能”的答案。

我不介意使用电源按钮而不是音量键(事实上两者都很好),但这似乎更难实现。

TLDR:

  1. 如何阻止监听器阻塞他们正在监听的键。

    2.如何在后台运行它。

任何帮助将不胜感激!

编辑:关于 no2,我找到了一种使用电源按钮执行此操作的方法,方法是在服务中注册广播接收器并监听屏幕关闭和屏幕开启意图。

【问题讨论】:

    标签: java android


    【解决方案1】:

    覆盖onKeyDown()Activity 更容易;因为它总是KeyEvent.ACTION_DOWN

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        switch (keyCode) {
            case KeyEvent.KEYCODE_VOLUME_UP: {
                System.out.println("UP");
            }
            case KeyEvent.KEYCODE_VOLUME_DOWN: {
                System.out.println("DOWN");
            }
        }
        return super.onKeyDown(keyCode, event);
    }
    

    【讨论】:

    • @DavidPH 这里也有解释:stackoverflow.com/questions/7846050/… ...您不是在听“按键事件”(如标题所述),而是在听按键调度事件。覆盖框架的类和调用/返回 super() 类的覆盖方法可能具有最少的副作用。为事件返回 true 意味着它们已被消耗 - 它们不会再冒泡(这可能是理想的或不理想的)。
    【解决方案2】:

    如何阻止监听器阻塞他们正在监听的键。

    正如您在android docs 中看到的,如果您不需要阻止您的密钥,只需调用super.dispatchKeyEvent(event); 否则如果您return true; 这意味着您消费了事件,没有人会知道事件。

    如何在后台运行。

    我认为,不可能。 Android有服务,可以做后台工作,但这不是处理系统按钮点击的方式。 Maybe this topic will help you.

    【讨论】:

    • 您好,感谢您的回答阻止了它阻止密钥。至于在后台运行,我以前见过这样做的应用程序,但“不可能”似乎是这个问题的最常见答案。真是莫名其妙。
    • @DavidPH 告诉我们这样做的目的。也许改变方式。
    • @Dimitro Ivanov 我有一个模式我想在屏幕关闭时振动(应用程序可以在屏幕关闭时在后台)并且用户触发它,这是通过音量键的组合或按电源键。
    • @DavidPH 如您所知,Android 操作系统已经处理了音量键和电源键。这不是常见的问题,但请继续。编码愉快!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-15
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多