Android - Кнопки громкости, используемые в моем приложении
Мне нужно использовать кнопки громкости для управления переменным параметром в моем приложении.
Я использую Activity.onKeyDown
, чтобы получать уведомление, когда кнопка нажата, но объем носителя также увеличивается.
Android делает что-то вроде ниже, когда я нажимаю клавишу регулировки громкости:
- увеличить объем носителя/мелодии звонка
- передать событие в мое приложение
Есть ли способ избежать увеличения объема системы и использовать клавишу тома только для моего приложения?
Ответы
Ответ 1
Вам нужно зафиксировать все действия:
@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
Следующее будет лучше, потому что длинный клик для 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);
}
}
Ответ 3
Чтобы завершить предыдущие ответы, если вы хотите поддерживать длинные клики, вы должны проверить, как долго ключ был недоступен, используя:
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);
}
}
Ответ 4
Я использовал этот код для прослушивания кнопки громкости раньше.
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_VOLUME_DOWN)){
//Do something
}
return true;
}
Ответ 5
Использование кнопки громкости во фрагментах
Если вы хотите реализовать это в фрагментах, связанных с Activity, вы можете использовать их как:
Примечание: фрагмент_слова - это просто имя макета, которое используется произвольно
@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;
}
}
});}
Ответ 6
громкость с двойным кликом
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);
}
}