聆听按键事件会阻止按键正常工作

时间:2018-12-22 00:31:32

标签: java android

我是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。如何在后台运行。

  2.   

任何帮助将不胜感激!

编辑:关于第2点,我找到了一种方法,通过在服务中注册广播接收器并收听屏幕关闭和意图显示,可以使用电源按钮进行操作。

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:0)

  

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

android docs中可以看到,如果您不需要阻止密钥,只需调用super.dispatchKeyEvent(event);,否则如果您return true;意味着您消耗了事件,那么没人会知道关于事件。

  

如何在后台运行此程序。

我认为,不可能。 Android提供了可以执行后台工作的服务,但是这种方式无法处理系统按钮的点击。 Maybe this topic will help you.