Клавиша возврата Android с помощью программного обеспечения

#android

#Android

Вопрос:

Кто-нибудь знает, как я могу имитировать нажатие клавиши возврата с помощью программного обеспечения? Я видел несколько приложений, которые имитируют эту клавишу и несколько других клавиш, таких как home и search. Но поскольку эти программы не были с открытым исходным кодом, я попытался создать свое собственное приложение, которое может управлять этими задачами. Вернуться домой, например, очень просто, потому что мне нужно было отправить только одно намерение. Итак … что я могу сделать, чтобы имитировать клавишу возврата? 🙂

Обновить:

Я загрузил приложение с открытым исходным кодом, которое имеет те же функции сhttp://git.hoopajoo.net

Там это сделано вот так:

 Process process = Runtime.getRuntime().exec("su");
OutputStream outputStream = process.getOutputStream();
String cmd = "keycode "   KeyEvent.KEYCODE_BACK;
outputStream.write((cmd   "n").getBytes("ASCII"));
  

Откуда берется команда «keycode»? Я не смог найти ни одного так называемого двоичного файла в моем Android rootfs ?!?!

Комментарии:

1. Почему вы хотите имитировать клавишу возврата? Какова цель?

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

Ответ №1:

Метод Aleadam не работает на моем Android 4.1.2. Я не знаю почему, но это обходное решение работает:

 public void dispachBackKey() {
    dispatchKeyEvent(new KeyEvent (KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK));
    dispatchKeyEvent(new KeyEvent (KeyEvent.ACTION_UP, KeyEvent.KEYCODE_BACK));
}
  

Комментарии:

1. Спасибо… Я искал весь день, только вызов ACTION_DOWN не работал… Вызов обоих событий (вместе составляющих щелчок) работает отлично. 🙂

Ответ №2:

Чтобы имитировать нажатие клавиши, вы можете отправить ключевое событие:

 myView.getRootView().dispatchKeyEvent(new KeyEvent (KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK));
  

Альтернативным решением для этой ситуации является постоянное уведомление (см.http://developer.android.com/reference/android/app/NotificationManager.html ), которая остановит службу при нажатии.

Комментарии:

1. Хм, ничего не происходит, когда я помещаю это в свой слушатель. backButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Log.d(TAG, "### onClick (backButton)"); v.getRootView().dispatchKeyEvent(new KeyEvent (KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK)); } }); Я получаю сообщение журнала, но больше ничего не происходит: (

2. Обрабатывает ли ваша активность ключевое событие? Но если у вас будет кнопка, просто используйте это clickevent для вызова getContext().stopService (Intent service)

3. Приведенный выше код должен обрабатываться Activity , а не Service . getRootView() возвращает корень View этого же действия. Смотрите также альтернативу выше.

4. @Aleadam Возможно ли использовать ваш код из плавающего представления (который существует в сервисе) для имитации обратной клавиши при работе на переднем плане?

Ответ №3:

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

В командной оболочке для эмуляции ключевого события используйте input keyevent . Просматривая документацию, код клавиши для кнопки возврата () равен 4. Итак, сделайте это:

 input keyevent 4
  

http://forum.xda-developers.com/showthread.php?t=971768

http://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_BACK

Ответ №4:

Вы должны вызвать onKeyDown() функцию. Получить код ключа несложно, но вам может потребоваться что-то сделать, чтобы выдать нормальное событие.

Комментарии:

1. Вы определенно не должны вызывать ее, переопределите ее вместо этого.

2. Я не согласен: он хочет ИМИТИРОВАТЬ кнопку возврата, а не переопределять ее. Для выполнения последнего вы хотите написать свою собственную функцию, но для имитации поведения вы должны выполнить onclick, который ее вызывает.