#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, который ее вызывает.