Android перехват нажатия клавиш

Клавиатура и аппаратные кнопки

Аппаратные и клавиатурные клавиши

Обработка аппаратных клавиш и клавиатуры имеет следующие методы

  • onKeyDown() — вызывается при нажатии любой аппаратной клавиши;
  • onKeyUp() — вызывается при отпускании любой аппаратной клавиши;

Кроме клавиш, есть ещё другие методы обработки пользовательского ввода (здесь не рассматриваются):

  • onTrackballEvent() — срабатывает при движениях трекбола;
  • onTouchEvent() — обработчик событий сенсорного экрана, срабатывает при касании, убирания пальца и при перетаскивании.

Чтобы ваши компоненты и активности реагировали на нажатия клавиш, переопределите обработчики событий onKeyUp() и onKeyDown():

Параметр keyCode содержит код клавиши, которая была нажата; сравнивайте его со статическими кодами клавиш, хранящимися в классе KeyEvent, чтобы выполнять соответствующую обработку.

Параметр KeyEvent также включает в себя несколько методов: isAltPressed(), isShiftPressed() и isSymPressed(), определяющих, были ли нажаты функциональные клавиши, такие как Alt, Shift или Sym. Статический метод isModifierKey() принимает keyCode и определяет, является ли нажатая клавиша модификатором.

Кнопка Back: Вы уверены, что хотите выйти из программы?

Кнопка Back (Назад) закрывает приложение, точнее текущую активность, но если приложение состоит из одной активности, то это равносильно закрытию всего приложения. В большинстве случаев вам нет никакого дела до неуклюжего пользователя, который по ошибке нажал на кнопку «Back» вместо кнопки Подарить разработчику миллион. Но, если ваша программа, будучи запущенной на телефоне пользователя, потихоньку списывает деньги клиента в счёт Фонда голодных котов, то нужно дать ему шанс задуматься и вывести диалоговое окно с вопросом: «А действительно ли вы хотите выйти из программы?»

Чтобы реализовать такую задачу, нужно переопределить поведение кнопки «Back» через метод активности onBackPressed() следующим образом:

Данный метод появился в Android 2.0. Для более ранних версий использовался стандартный код обработки onKeyDown():

Двойное нажатие на кнопку Back

Другой вариант — выход из приложения при двойном нажатии на кнопку «Back». Удобно в тех случаях, когда считаете, что пользователь может случайно нажать на кнопку, например, во время активной игры. Приложение закроется, если пользователь дважды нажмёт на кнопку в течение двух секунд.

Кнопка Home

Можно отследить нажатие кнопки Home через метод активности onUserLeaveHint():

Обработка кнопки Menu

У телефона, кроме кнопки «Back», есть ещё кнопка «Menu» для вызова команд меню (на старых устройствах). Если необходимо обрабатывать нажатия этой кнопки (например, управление в игре), то используйте следующий код (обычное и долгое нажатие):

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

Другие кнопки

Ну на самом деле можно отслеживать не только нажатие кнопки Меню, но и кнопку Поиска и кнопки увеличения громкости.

Обратите внимание, что для кнопки громкости возвращаем false, т.е. мы не переопределяем поведение кнопки, а оставляем её на усмотрение системы.

Пример работы с кнопками громкости можно посмотреть в статье Рингтоны. Управление громкостью

По такому же принципу работает метод onKeyUp(). Метод onKeyLongPress() можно использовать, если в методе onKeyDown() был задействован метод event.startTracking(), отслеживающий поведение кнопки. В нашем примере мы отслеживали кнопку Volume_Up.

Читайте также:  Стерлись все номера андроид

Прячем клавиатуру

Бывает так, что при запуске активности сразу выскакивает клавиатура. Если такое поведение не нравится, то пропишите в манифесте нужное значение у атрибута android:windowSoftInputMode (см. ниже).

В некоторых случаях хочется убрать клавиатуру с экрана, не нажимая кнопку «Back», а программно. В одном моём приложении, где было много текстовых полей, я воспользовался следующим кодом при щелчке кнопки:

Код так выглядит, если писать его в Activity. Если расположить его в другом классе, экземпляр Activity нужно передать туда как параметр и вызывать методы как activity.getApplicationContext(), где activity — экземпляр Activity.

Можно избавить компонент от фокуса:

Чтобы принудительно показать клавиатуру, используйте следующий код:

Кстати, повторный вызов метода закроет клавиатуру. Указанный способ не требует наличия элементов View.

Если продолжить тему показа клавиатуры, то может возникнуть следующая ситуация. Допустим у вас есть DialogFragment с EditText. При выводе диалогового окна вам нужно установить фокус на EditText и показать клавиатуру:

Либо используйте тег для нужного EditText.

Изменить вид клавиатуры для EditText

Когда элемент EditText получает фокус, то появляется клавиатура. Можно установить нужный вид клавиатуры через атрибут InputType или программно через метод setInputType():

TYPE_CLASS_DATETIME — дата и время
TYPE_CLASS_NUMBER — цифры
TYPE_CLASS_TEXT — буквы

Переопределяем кнопку Enter

Кроме атрибута InputType можно также использовать атрибут android:imeOptions в компоненте EditText, который позволяет заменить кнопку Enter на клавиатуре на другие кнопки, например, Next, Go, Search и др. Возможны следующие значения:

  • actionUnspecified: Используется по умолчанию. Система сама выбирает нужный вид кнопки (IME_NULL)
  • actionGo: Выводит надпись Go. Действует как клавиша Enter при наборе адреса в адресной строке браузера (IME_ACTION_GO)
  • actionSearch: Выводит значок поиска (IME_ACTION_SEARCH)
  • actionSend: Выводит надпись Send (IME_ACTION_SEND)
  • actionNext: Выводит надпись Next (IME_ACTION_NEXT)
  • actionDone: Выводи надпись Done (IME_ACTION_DONE)

Чтобы увидеть все варианты воочию, можете создать несколько текстовых полей и переключаться между ними:

Чтобы реагировать на нажатия разных состояний кнопки Enter, необходимо реализовать интерфейс TextView.OnEditorActionListener. Небольшой пример:

В нашем примере если пользователь ищет что-то, не связанное с котом, то кнопка поиска не будет выполнять желание владельца устройства.

Также можно поменять текст на кнопке с помощью атрибута android:imeActionLabel:

Текст на кнопке поменялся, но вот обработка Enter из предыдущего примера у меня перестала работать. Мой неработающий код на память.

Upd: Читатель Максим Г. предложил следующее решение проблемы. Убираем атрибуты imeOptions, imeActionId, imeActionLabel и установим их программно.

По желанию можете отслеживать только у нужного поля. Поставьте дополнительное условие после первого блока if:

Интерфейс OnKeyListener

Чтобы среагировать на нажатие клавиши внутри существующего представления из активности, реализуйте интерфейс OnKeyListener и назначьте его для объекта View, используя метод setOnKeyListener(). Вместо того, чтобы реализовывать отдельные методы для событий нажатия и отпускания клавиш, OnKeyListener использует единое событие onKey().

Используйте параметр keyCode для получения клавиши, которая была нажата. Параметр KeyEvent нужен для распознавания типа события (нажатие представлено константой ACTION_DOWN, а отпускание — ACTION_UP).

Сдвигаем активность

Чтобы всплывающая клавиатура не заслоняла элемент интерфейса, который получил фокус, а сдвигала активность вверх, можно в манифесте для нужной активности прописать атрибут android:windowSoftInputMode с параметром adjustPan:

Читайте также:  Cinema 4k mod для андроид

Также доступны и другие параметры:

  • stateUnspecified — настройка по умолчанию. Система сама выбирает подходящее поведение клавиатуры.
  • stateUnchanged — клавиатура сохраняет своё последнее состояние (видимое или невидимое), когда активность с текстовым полем получает фокус.
  • stateHidden — клавиатура скрыта, когда открывается активность. Клавиатура появится при наборе текста. Если пользователь переключится на другую активность, то клавиатура будут скрыта, но при возвращении назад клавиатура останется на экране, если она была видима при закрытии активности.
  • stateAlwaysHidden — клавиатура всегда скрывается, если активность получает фокус.
  • stateVisible — клавиатура видима.
  • stateAlwaysVisible — клавиатура становится видимой, когда пользователь открывает активность.
  • adjustResize — размеры компонентов в окне активности могут изменяться, чтобы освободить место для экранной клавиатуры.
  • adjustPan — окно активности и его компоненты не изменяются, а сдвигаются таким образом, чтобы текстовое поле с фокусом не было закрыто клавиатурой.
  • adjustUnspecified — настройка по умолчанию. Система сама выбирает нужный режим.

Параметры с префиксом state можно комбинировать с настройками с префиксом adjust:

Например, чтобы показать клавиатуру при старте активности, используйте stateVisible.

Данные настройки доступны и программно. Например, код для adjustResize:

Кстати, этот код не сработает в полноэкранном режиме (флаг FLAG_FULLSCREEN). Сверяйтесь с документацией.

Узнать выбранный язык на клавиатуре

Для определения текущего языка на клавиатуре можно использовать следующий код.

Следует быть осторожным с примером. На эмуляторе с Android 6.0 пример работал корректно. На реальных устройствах у меня корректно определялся русский язык, но при переключении на английский язык выдавал пустую строку или значение «zz». В этом случае можно прибегнуть к условиям if и проверять ожидаемое значение.

Источник

Перехват нажатий клавиш смартфона при помощи акселерометра

Двое исследователей из Калифорнийского университета в Дэвисе (UC Davis), Хао Чэнь (Hao Chen) и Лянь Цай (Lian Cai) нашли способ определять, какие клавиши были нажаты на экранной клавиатуре ОС Android путем измерения смещений, покачиваний и вибрации устройства, измеренных встроенным акселерометром [Прим. перев.: и гироскопом]. Это важно, поскольку данные от акселерометров не рассматривались как потенциальный вектор атаки, и, таким образом, свободно доступны любому приложению на любом смартфоне или планшете.

Перехват нажатий клавиш на настольном компьютере или ноутбуке под Windows или Мас невероятно прост: установите соответствующую программу (или троян это сделает за вас), настройте, куда она должна сохранять или отправлять украденные коды клавиш, и всё! Когда речь идет о смартфонах, однако, сложные системы ограничения прав доступа делают этот подход практически невозможным, если только не использовать так называемые побочные каналы. Строго говоря, побочным каналом называется открытый источник информации, который помогает атакующему взломать криптографическую систему. В более широком смысле, побочным каналом может быть лампочка на маршрутизаторе, мигающая в такт передаваемым данным, или звуки нажатия клавиш физической клавиатуры. [Прим. перев.: упомянуты не гипотетические возможности, а реально осуществленные разновидности атак. Буду благодарен тому, кто поможет найти ссылки. Пруф, #3.2.2, #4.2.1] Другими словами, побочные каналы — это характеристики системы, потенциальная опасность которых упускается из виду.

В данном случае двое исследователей использовали данные пространственной ориентации устройства на базе Android — набор из трех углов, задающих ориентацию телефона в пространстве XYZ — чтобы определить, в каком месте пользователь нажал на экран. В принципе, каждая клавиша имеет уникальную картину изменений углов по трем осям, которые могут быть идентифицированы (см. ниже). Точность зависит от модели телефона: HTC Evo 4G обновляет данные об ориентации каждые 30 мс, а Motorola Droid — каждые 110 мс. В целом, исследователям удалось достичь 71,5% точности для 10-кнопочной клавиатуры. Оставшиеся 28,5% составляют ошибки из-за близкого расположения клавиш. Программа (кстати, названная TouchLogger) может, в общем случае, правильно определить столбец или строку для каждого нажатия, но иногда ей не хватает данных для того, чтобы распознать конкретную клавишу.

Читайте также:  Тюрьма побег приключение андроид


Полная QWERTY-клавиатура, естественно, более сложна для распознавания нажатий, чем 10-кнопочная цифровая, но перед нами только демонстрация принципа, а точности в 70% более, чем достаточно, чтобы нарушить конфиденциальность любых данных, вводимых в телефон. Кроме того, в работе далее отмечается, что на более крупных устройствах, такие как планшеты, должно быть легче контролировать клавиатуру; а также можно использовать гироскопы совместно с камерой для увеличения разрешения и точности TouchLogger.

Наконец, важно отметить, что этот побочный канал — не просто дыра в безопасности Android: данные акселерометра и гироскопа доступны через API DeviceOrientation, который реализован в Android 3.0, IOS 4.2, а также во всех современными браузерах. Другими словами, этот эксплоит будет требовать установки TouchLogger на телефон Android, но в теории, кто-то может взять работу Чэнь и Цай, реализовать в JavaScript, а затем использовать, чтобы украсть ваши пароли и информацию о кредитных картах когда вы путешествуете в интернете.

Статья в журнале New Scientist, статья о TouchLogger [PDF]

Источник

Обработка нажатий клавиш программной клавиатуры

Не знаю, была ли эта тема. Но столкнулся с такой проблемой: допустим есть макет с EditText и ListView. Они отображаются сверху вниз в порядке описания. Необходимо записать текст в EditText, а затем по нажатию клавиши, добавить этот текст в ListView, через адаптер.

Следующий код, как я уже выяснил не работает с программной клавиатурой, а только с физической:

Обработка нажатий клавиш громкости непосредственно Service (Activity уже закрыто)
Уважаемые форумчане! Буду благодарен за любую помощь. Написал добрую часть приложения для.

Обработка нажатий клавиш мыши и кнопок клавиатуры
Здравствуйте, возникла проблема с кодом: private void Form1_MouseDown(object sender.

Обработка нажатий клавиш
Добрый день! Решил сделать небольшую обработку нажатий клавиш в приложении, списал один из.

Обработка нажатий клавиш
подскажите как обрабатывать нажатия клавиш символов (цифры, буквы) в WinApi C++, служебные клавиши.

TextWatcher здесь не подойдет, насколько я понимаю, хотя, конечно, могу быть не прав.

Добавлено через 23 минуты
По умолчанию при нажатии на кнопку «enter» в телефоне, в Edittext происходит переход на новую строку. Вообще возможно обработать событие нажатия этой кнопки, либо других, например цифр. Если да, вы могли бы привести фрагмент кода?

Решение

Предупреждаю сразу — это чисто в доказательство реализации через TextWatcher.
Даже, если это вариант удаления гланд через задницу — я не виноват.

Вводим переменную, хрянящую текст до момента нажатия.
В момент изменения смотрим на введенный символ и, если это возврат каретки, выводим ранее введенный текст.

Задача решена — есть перехват ввода ‘энтер’ и реакция на его ввод.
Полетит ли этот самолёт дальше — не знаю.

Источник

Оцените статью