Статьи

Android SDK: перехват физических ключевых событий

В этом руководстве вы узнаете, как управлять событиями физических ключей, доступных на каждом устройстве Android. Когда вы узнаете, как это сделать, вы сможете позволить пользователю управлять вашим приложением новыми и интересными способами.


Каждое устройство Android снабжено физическими ключами, и производитель должен реализовать их все. Например, Sony обычно реализует только 3 из них, и эти кнопки являются хорошим шансом дать нашему пользователю возможность для нового типа взаимодействия с разрабатываемым нами приложением.

Приложения Android основаны на Activity, и вам следует знать одну из реализаций класса Activity. Вы можете проверить их все в официальном справочнике , но на этот раз мы попробуем интерфейс KeyEvent.Callback, который дает нам методы, необходимые для взаимодействия с физическими ключами.


Класс KeyEvent имеет несколько ключевых констант, которые представляют разные ключи на стандартном устройстве Android. Наиболее известные ключи:

Таблица ключей

Но вы можете найти больше констант в официальной документации .

Для физических ключей методы обратного вызова:

  • OnKeyDown ()
  • OnKeyUp ()
  • onKeyLongPress ()

Для обратных вызовов трекбола и сенсорного экрана:

  • onTrackballEvent ()
  • onTouchEvent ()

Вы можете выбрать, какие из них реализовать и настроить, и вам не нужно реализовывать их все. Например, если вы хотите избежать непреднамеренного нажатия клавиши CAMERA или SEARCH во время работы вашего приложения, вы можете настроить их в обратном вызове onKeyDown () и затем вернуть true, чтобы система знала, что ваше приложение использует событие.


Есть некоторые ключи, которые вы не сможете настроить, потому что они перехватываются системой напрямую. В частности, этими клавишами являются кнопка питания и домашний ключ. Клавиша «Назад» также является особенной. Если вы хотите переопределить его поведение, вы можете сделать это с помощью его собственного метода onBackPressed (), но настоятельно рекомендуется этого не делать, поскольку его обычная реализация позволяет пользователям перемещаться между предыдущими экранами и используется почти исключительно для этой цели.


Вы можете создать новый проект Android, чтобы попробовать это руководство, или вы можете реализовать эти новые методы непосредственно в проекте, который у вас уже есть.

Чтобы создать новый проект в Eclipse, перейдите в File -> New -> Project -> Android Project. Заполните детали проекта вашими предпочтениями и нажмите «Готово». Теперь ваш новый проект будет находиться в левой части вашей Eclipse IDE.

Шаг 1: Создайте новый проект

Первый метод для переопределения это onKeyDown ():

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
 switch(keyCode){
 case KeyEvent.KEYCODE_MENU:
     Toast.makeText(this, «Menu key pressed», Toast.LENGTH_SHORT).show();
    return true;
   case KeyEvent.KEYCODE_SEARCH:
     Toast.makeText(this, «Search key pressed», Toast.LENGTH_SHORT).show();
     return true;
   case KeyEvent.KEYCODE_BACK:
     onBackPressed();
     return true;
   case KeyEvent.KEYCODE_VOLUME_UP:
     event.startTracking();
     return true;
   case KeyEvent.KEYCODE_VOLUME_DOWN:
     Toast.makeText(this,»Volumen Down pressed», Toast.LENGTH_SHORT).show();
     return false;
 }
 return super.onKeyDown(keyCode, event);
}

Переопределяя этот метод, мы настраиваем его поведение, поэтому каждый раз, когда мы нажимаем любую из этих клавиш, мы заставляем наше приложение использовать событие, возвращая true. Единственное исключение из этой логики — для клавиши VOLUME DOWN, так как мы не используем событие. Для клавиши «вниз», если возвращаемое значение равно false, это означает, что оно будет обработано системой, поэтому, когда вы нажимаете его, вы фактически уменьшаете громкость.

  • Клавиши «Меню» и «Поиск» перехватываются, чтобы показать сообщение на экране, а затем оно используется.
  • Клавиша Back перехватывается методом onBackPressed ().
  • Увеличение громкости перехватывается, и для отслеживания вызывается event.startTracking (). Если вы удерживаете его, он вызовет метод onKeyLongPress ().

Второй метод для переопределения это onKeyUp ():

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
 switch(keyCode){
   case KeyEvent.KEYCODE_MENU:
     Toast.makeText(this, «Menu key released», Toast.LENGTH_SHORT).show();
     return true;
   case KeyEvent.KEYCODE_SEARCH:
     Toast.makeText(this, «Search key released», Toast.LENGTH_SHORT).show();
     return true;
   case KeyEvent.KEYCODE_VOLUME_UP:​
     if(event.isTracking() && !event.isCanceled())
       Toast.makeText(this, «Volumen Up released», Toast.LENGTH_SHORT).show();
       return true;
   case KeyEvent.KEYCODE_VOLUME_DOWN:
     Toast.makeText(this, «Volumen Down released», Toast.LENGTH_SHORT).show();
     return true;
   }
   return super.onKeyDown(keyCode, event);
}

Как и в предыдущем методе, этот метод будет перехватывать при отпускании ключа. Вам решать, какие действия вы хотите предпринять в это время. В этом случае мы показываем сообщения на экране следующим образом:

  • Клавиши меню, поиска и уменьшения громкости перехвачены, чтобы показать простое сообщение.
  • Клавиша увеличения громкости покажет сообщение, если вы не нажимали его некоторое время.

Третий метод для переопределения это onKeyLongPress ():

1
2
3
4
5
@Override
public boolean onKeyLongPress(int keyCode, KeyEvent event) {
 Toast.makeText(this, «Pressed for a long time =) «, Toast.LENGTH_SHORT).show();
 return true;
}

Этот метод вызывается только тогда, когда ключ отслеживается путем вызова метода event.startTracking () в методе onKeyDown () и нажатия на некоторое время. В этом случае мы делаем это с помощью клавиши увеличения громкости.

Метод event.startTracking () отслеживает только один ключ за раз. Таким образом, если получено другое событие нажатия клавиши, отслеживание останавливается на предыдущем событии.


Четвертый метод для переопределения это onBackPressed ():

1
2
3
4
5
@Override
public void onBackPressed() {
 Toast.makeText(this, «Back key pressed =)», Toast.LENGTH_SHORT).show();
 super.onBackPressed();
}

Этот метод предназначен только для клавиши возврата, как описано выше, и, опять же, вы должны быть очень осторожны при попытке переопределить его.


Пятый метод для переопределения это onTouchEvent ():

1
2
3
4
5
6
7
@Override
public boolean onTouchEvent(MotionEvent event) {
 float x = event.getX();
 float y = event.getY();
 Toast.makeText(this, «Touch press on x: » + x + » y: «+y, Toast.LENGTH_SHORT).show();
 return true;
}

Этот метод будет перехватывать события, сделанные на экране. В этом случае мы показываем в сообщении координаты, где был нажат экран.


Переопределив эти методы, вы улучшите контроль над своим приложением. Вы также сможете создавать новые уникальные пользовательские интерфейсы и элементы управления навигацией в своих проектах.