2016-09-22 94 views
0

在我的应用程序中,我覆盖了volume upvolume down键。问题是,当用户点击这两个键中的一个时,播放声音。我想以某种方式禁用/静音此声音。音量键单击时禁用声音

这里是我的代码片段:

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 

    switch (keyCode) { 

     case KeyEvent.KEYCODE_VOLUME_DOWN: { 
      // do something when user click volume down key 

      return true; 
     } 
     case KeyEvent.KEYCODE_VOLUME_UP: { 
      // do something when user click volume up key 

      return true; 
     } 

    } 
    return super.onKeyDown(keyCode, event); 
} 

回答

1

使用onKeyDown或onKeyUp仍然会给出更改音量的默认声音。改用dispatchKeyEvent。

@Override 
public boolean dispatchKeyEvent(KeyEvent event) { 
    int keyCode = event.getKeyCode(); 
    switch (keyCode) { 
    case KeyEvent.KEYCODE_VOLUME_UP: 
    case KeyEvent.KEYCODE_VOLUME_DOWN: 
     return true; 
    default: 
     return super.dispatchKeyEvent(event); 
    } 
} 
+0

使用'dispatchKeyEvent',您可以检测按钮何时按下,但无法检测按钮位置(上或下)。在我的例子中,我使用了'onKeyDown'。这种方法不会消除声音,所以我必须发挥无限的声音。 – Da2da2

+0

不,在我的示例中,您可以看到keyCode并以相同的方式使用它。它的作品,我在我的应用程序中使用这种方法。 –

+0

我并不是说你的方法行不通,这是正常的,但不是在我的情况下。我想按照我说的检测按钮位置** ** ** ** ** ** **时的位置。如果我按下一个按钮(例如'KEYCODE_VOLUME_UP')一次,'dispatchKeyEvent'将被调用两次,如果我用'onKeyDown'和'onKeyUp'来执行,它们将一个接一个地开始,然后给我更详细的按钮当前状态的信息。 – Da2da2

0

我想通了自己。 按下音量键时可以停止声音。您需要无限播放空声音,因此当用户单击音量键时,它会“尝试”更改媒体音量,因此不会播放点击声音。 您可以通过搜索empty sound下载一个空的声音,然后将其放入项目的raw文件夹中。 最后一步就是覆盖音量键。

以下是您需要的代码:

定义MediaPlayer变量。

private MediaPlayer infinite_sound; 

onResume()你需要无限打空的声音。

@Override 
protected void onResume() { 
    super.onResume(); 

    infinite_sound = MediaPlayer.create(this, R.raw.empty); 
    infinite_sound.setLooping(true); 
    infinite_sound.start(); 
} 

onPause()您需要停止声音。

@Override 
public void onPause() { 
    super.onPause(); 

    infinite_sound.release(); 
} 

最后重写按钮的操作。

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    switch (keyCode) { 
     case KeyEvent.KEYCODE_VOLUME_DOWN: { 
      // Do something when volume down button is clicked 

      return true; 
     } 
     case KeyEvent.KEYCODE_VOLUME_UP: { 
      // Do something when volume up button is clicked 

      return true; 
     } 
    } 
    return super.onKeyDown(keyCode, event); 
}