Android - кнопки громкости, используемые в моем приложении - PullRequest
39 голосов
/ 20 мая 2010

Мне нужно использовать кнопки громкости для управления переменным параметром в моем приложении. Я использую Activity.onKeyDown, чтобы получать уведомления при нажатии кнопки, но громкость носителя также увеличивается.
Android делает что-то вроде ниже, когда я нажимаю клавишу громкости:

  1. увеличение громкости мультимедиа / мелодии звонка
  2. передать событие в мое приложение

Есть ли способ избежать увеличения системной громкости и использовать клавишу громкости только для моего приложения?

Ответы [ 7 ]

102 голосов
/ 20 мая 2010

Вам нужно захватить все действия:

@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);
        }
    }
11 голосов
/ 07 октября 2012

Следующее было бы лучше, потому что длинный щелчок для KeyEvent.KEYCODE_VOLUME_UP не работает правильно в предыдущем ответе.

@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);
    }
}
2 голосов
/ 22 октября 2015

Просто, чтобы завершить предыдущие ответы, если вам нужна поддержка длинных щелчков, вы должны проверить, как долго клавиша не работала, используя:

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

В итоге код будет выглядеть так:

    @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);
    }
}
1 голос
/ 31 января 2015

Использование кнопки громкости во фрагментах

Если вы хотите реализовать это во фрагментах, связанных с действием, вы можете использовать как:

Обратите внимание: фрагмент_слов - это просто имя макета, которое используется произвольно

@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;
                }
            }
        });}
1 голос
/ 09 января 2015

Я использовал этот код для прослушивания кнопки громкости раньше.

  @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_VOLUME_DOWN)){
            //Do something
        }
        return true;
    }
0 голосов
/ 14 марта 2019

У меня была проблема с АБ затвором (Bluetooth), всегда запускающим громкость, в то время как я хотел использовать событие Bluetooth для чего-то другого. но я все еще хотел, чтобы громкость работала, если исходить из кнопки увеличения громкости устройства. Решение, которое я нашел, состояло в том, чтобы обрабатывать короткие события для моей цели - и разрешать изменение громкости только при нажатии на кнопку устройства в течение более секунды. см код:

boolean bVolumeUpKeyDown = false;
long StartDownMS = 0;

@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) {
                // my handling of keyevent
                return true;
              }
              else if  (action == KeyEvent.ACTION_DOWN) {
                  if(bVolumeUpKeyDown == false) {
                      bVolumeUpKeyDown = true;
                      StartDownMS = System.currentTimeMillis();
                  }
                  else if(System.currentTimeMillis() - StartDownMS > 1000)
                      return super.dispatchKeyEvent(event); // normal volume up handling
            }
            return true;

       case KeyEvent.KEYCODE_ENTER:
           if (action == KeyEvent.ACTION_UP) {
           //my handling of second ab shutter button
                }
            return true;

       default:
            return super.dispatchKeyEvent(event);
    }
}
0 голосов
/ 13 декабря 2018

громкость с двойным кликом

public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {
        i++;
        Handler handler= new Handler();
        Runnable runnable=new Runnable() {
            @Override
            public void run() {
                i=0;
            }
        };
        if(i==1){
            Toast.makeText(getApplicationContext(),"single click",Toast.LENGTH_SHORT).show();
            handler.postDelayed(runnable,400);
        }
        else if(i==2){
            Vibrator vb = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
            vb.vibrate(100);
        }

        return true;
    }
    if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
        return true;
    } else {
        return super.onKeyDown(keyCode, event);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...