如何检测长按一起上下音量?

时间:2018-04-19 06:05:36

标签: android button volume

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

如果按下,我需要调用一个函数。如果我的应用程序安装在任何Android设备中,此检测应该有效。任何近乎解决方案也会这样做。

3 个答案:

答案 0 :(得分:2)

您需要使用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;
}

答案 1 :(得分:1)

您需要覆盖某些方法并在那里应用您的逻辑:例如,创建以下变量

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秒钟内按下音量键后按下音量调低键,此代码将打印一个吐司。我希望您可以将此代码更改为向下组合键,因为这是上下组合。

答案 2 :(得分:1)

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;