【问题标题】:How to detect volume up and down long pressed together?如何检测音量上下长按在一起?
【发布时间】:2020-01-22 22:05:05
【问题描述】:

如何检查Android设备中音量增大和音量减小按钮是否同时按下几秒钟?

如果按下,我需要调用一个函数。如果我的应用程序安装在任何 android 设备中,此检测应该有效。任何接近的解决方案也可以。

【问题讨论】:

    标签: android button volume


    【解决方案1】:

    您需要使用onKeyDown 回调来检测两个键何时被按下,类似的东西应该可以工作:

    public boolean up,down;
    
    public boolean onKeyDown(int keyCode, KeyEvent event) {
       if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN){
          down = true;
       } else if(keyCode == KeyEvent.KEYCODE_VOLUME_UP){
          up = true;
       }
       if(up && down) {
        // Two buttons pressed, call your function
       }
       return true;
    }
    
    public boolean onKeyUp(int keyCode, KeyEvent event) {
      if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN){
        down = false;
      } else if(keyCode == KeyEvent.KEYCODE_VOLUME_UP){
        up = false;
      }
      return true;
    }
    

    【讨论】:

    • 我该怎么做才能检查它是否被按下了一段时间,比如 2 秒?
    • 您可以使用一个新变量,例如:upKeyTime = event.getEventTime(); 来确定按键被按下的时间量。
    • 还有一件事!即使应用程序在后台或屏幕关闭时,我应该怎么做才能使其工作。因为这是用于紧急应用程序,即使应用程序未运行或手机被锁定,我也需要检测按钮按下。有可能吗?
    • @AbhishekSingh Is it possible? 不,不是
    • @AbhishekSingh 不幸的是,按键仅在应用程序处于前台时有效,并且不允许您从服务中检索它们。见这里:developer.android.com/training/keyboard-input/index.html。但是,您应该创建另一个问题,也许有一些解决方法。
    【解决方案2】:

    你需要重写一些方法并在那里应用你的逻辑:例如,创建以下变量

    private static final int PRESS_INTERVAL = 1000;
    private long upKeyTime = 0;
    

    覆盖下面的

     @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {
            if (KeyEvent.KEYCODE_VOLUME_DOWN == event.getKeyCode()) {
                if ((event.getEventTime() - upKeyTime) < PRESS_INTERVAL) {
                    Toast.makeText(this, "Pressed together", Toast.LENGTH_SHORT).show();
                }
                return true;
            } else if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
                return true;
            }
            return super.onKeyDown(keyCode, event);
        }
    
    
        @Override
        public boolean onKeyUp(int keyCode, KeyEvent event) {
            if (KeyEvent.KEYCODE_VOLUME_UP == keyCode) {
                upKeyTime = event.getEventTime();
            }
            return super.onKeyUp(keyCode, event);
        }
    

    如果用户在音量增大键后 1 秒内按下音量减小键,此代码将打印一个 toast。我希望您可以将此代码更改为上下组合键,因为这是上下组合。

    【讨论】:

    • 非常感谢。该代码有效。你知道有什么方法可以让我在手机被锁定或应用程序没有打开的情况下使用这个检测吗?
    • 恐怕这是不可能的,正如@RomainGuy 所说的here
    • @AbhishekSingh 请注意:您应该过于频繁地更改您选择的答案。昨天您多次更改了您选择的答案.. 今天您也做了同样的事情。只需选择适合您的。
    • 我是新来的,我认为可以将多个答案标记为正确,所以每当我看到未选中的答案时,我点击它,后来我只知道一个选择。对不起,谢谢你:)
    【解决方案3】:
    public static final int VOLUME_PRESSED__INTERVAL = 100;
    private long upKeyEventTime = 0;
    private long downKeyEventTime = 0;
    
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
    
        if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN || keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
            if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {
                downKeyEventTime = event.getEventTime();
            } else {
                upKeyEventTime = event.getEventTime();
            }
            if (Math.abs(upKeyEventTime - downKeyEventTime)<= VOLUME_PRESSED__INTERVAL){
                //TODO call your method
                return false;
            }
        }
    
        return super.onKeyDown(keyCode, event);
    }
    

    如果您想要更准确,可以设置 VOLUME_PRESSED__INTERVAL = 0;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-28
      • 2015-04-12
      • 1970-01-01
      • 1970-01-01
      • 2011-11-23
      • 1970-01-01
      相关资源
      最近更新 更多