Android – Botones de volumen utilizados en mi aplicación

Necesito usar botones de volumen para controlar un parámetro variable en mi aplicación. Utilizo Activity.onKeyDown para recibir notificaciones cuando se presiona el botón, pero también aumenta el volumen de medios.
Android está haciendo algo como lo siguiente cuando presiono la tecla de volumen:

  1. boost el volumen de medios / tono de llamada
  2. pasar el evento a mi aplicación

¿Hay alguna manera de evitar boost el volumen del sistema y usar la tecla de volumen solo para mi aplicación?

Necesitas capturar todas las acciones:

 @Override 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) { //TODO } return true; case KeyEvent.KEYCODE_VOLUME_DOWN: if (action == KeyEvent.ACTION_DOWN) { //TODO } return true; default: return super.dispatchKeyEvent(event); } } 

El siguiente sería mejor porque un clic largo para KeyEvent.KEYCODE_VOLUME_UP no funciona correctamente en la respuesta anterior.

 @Override 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) { //TODO } return true; case KeyEvent.KEYCODE_VOLUME_DOWN: if (action == KeyEvent.ACTION_DOWN) { //TODO } return true; default: return super.dispatchKeyEvent(event); } } 

Solo para completar las respuestas anteriores, si desea un soporte de clic prolongado, debe verificar cuánto tiempo estuvo presionada la tecla usando:

 event.getEventTime() - event.getDownTime() > ViewConfiguration.getLongPressTimeout() 

Al final, el código se verá así:

  @Override public boolean dispatchKeyEvent(KeyEvent event) { int action = event.getAction(); int keyCode = event.getKeyCode(); switch (keyCode) { case KeyEvent.KEYCODE_VOLUME_UP: if (action == KeyEvent.ACTION_UP) { if (event.getEventTime() - event.getDownTime() > ViewConfiguration.getLongPressTimeout()) { //TODO long click action } else { //TODO click action } } return true; case KeyEvent.KEYCODE_VOLUME_DOWN: if (action == KeyEvent.ACTION_UP) { if (event.getEventTime() - event.getDownTime() > ViewConfiguration.getLongPressTimeout()) { //TODO long click action } else { //TODO click action } } return true; default: return super.dispatchKeyEvent(event); } } 

He usado este código para escuchar el botón de volumen anteriormente.

  @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_VOLUME_DOWN)){ //Do something } return true; } 

Uso del botón de volumen en fragmentos

Si desea implementar esto en fragmentos enlazados a la Actividad, puede usarlos como:

Aviso: fragment_words es solo un nombre de diseño que se usa arbitarly

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_words, container, false); rootView.requestFocus(); rootView.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if( keyCode == KeyEvent.KEYCOD_VOLUME_DOWN ) { //TODO SOMETHING return true; } else { return false; } } });}