Как имитировать кнопки «Домой», «Назад», «Меню», «Поиск», «Задачи» и «Громкость»?

Я хочу имитировать все физические кнопки наших устройств Android.

Итак, есть ли способ смоделировать:

  • КНОПКА НАЗАД
  • ГЛАВНАЯ КНОПКА
  • КНОПКА МЕНЮ
  • КНОПКА ПОИСКА
  • КНОПКА ЗАДАЧИ
  • КНОПКИ ГРОМКОСТИ (+ И -)

person Meroelyth    schedule 14.12.2012    source источник
comment
Вы хотите получить доступ к этим кнопкам из кода Java?   -  person Rajesh Rajaram    schedule 14.12.2012
comment
в GOOGLE много решений..   -  person Anand Tiwari    schedule 14.12.2012
comment
@RajeshRajaram Нет, я хочу вернуться домой или показать меню (и т. д. и т. д.) программно   -  person Meroelyth    schedule 14.12.2012
comment
@AnandTiwari Я нашел только код кнопки «Домой» android-simulate-home-click   -  person Meroelyth    schedule 14.12.2012


Ответы (7)


Создайте KeyEvent и опубликуйте его.

KeyEvent kdown = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK);
Activity.dispatchKeyEvent(kdown);
KeyEvent kup = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_BACK);
Activity.dispatchKeyEvent(kup);
person Aleksander Gralak    schedule 14.12.2012
comment
Большое спасибо... но я хочу сделать это программно, а не только из активности... - person Meroelyth; 14.12.2012
comment
Это точно программно, и вы всегда можете иметь ссылку на свою деятельность для вызова этого метода (вы не обязаны вызывать его в своей деятельности). - person Raphael Royer-Rivard; 26.12.2013
comment
@ Александр Гралак: ваш код не вызывает метод activity.onBackPressed между прочим ... - person Raphael Royer-Rivard; 27.12.2013
comment
Вы должны вызвать его как для действия вниз, так и для действия вверх. Например, this.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK)); this.dispatchKeyEvent (новый KeyEvent (KeyEvent.ACTION_UP, KeyEvent.KEYCODE_BACK)); - person Katianie; 17.05.2014

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

Создать сервис, расширенный из AccessibilityService:

class ExampleAccessService:AccessibilityService() {
    override fun onInterrupt() {
    }

    override fun onAccessibilityEvent(event: AccessibilityEvent?) {
    }
    
    fun doAction(){
        performGlobalAction(GLOBAL_ACTION_RECENTS)
//        performGlobalAction(GLOBAL_ACTION_BACK)
//        performGlobalAction(GLOBAL_ACTION_HOME)
//        performGlobalAction(GLOBAL_ACTION_NOTIFICATIONS)
//        performGlobalAction(GLOBAL_ACTION_POWER_DIALOG)
//        performGlobalAction(GLOBAL_ACTION_QUICK_SETTINGS)
//        performGlobalAction(GLOBAL_ACTION_TOGGLE_SPLIT_SCREEN)
    }
}

Позвоните doAction() там, где вы хотите действовать

Добавить к Manifest:

<application
...
    <service
        android:name=".ExampleAccessService"
        android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"
        android:label="Name of servise" // it will be viewed in Settings->Accessibility->Services
        android:enabled="true"
        android:exported="false" >
        <intent-filter>
            <action android:name="android.accessibilityservice.AccessibilityService"/>
        </intent-filter>
        <meta-data
            android:name="android.accessibilityservice"
            android:resource="@xml/accessibility_service_config"/>
    </service>
...
</application>

accessibility_service_config.xml:

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityEventTypes="typeAllMask"
    android:accessibilityFeedbackType="feedbackAllMask"
    android:accessibilityFlags="flagDefault"
    android:canRetrieveWindowContent="false"
    android:description="your description"
    android:notificationTimeout="100"
    android:packageNames="your app package, ex: ex: com.example.android"
    android:settingsActivity="your settings activity ex: com.example.android.MainActivity" />

для получения дополнительной информации см. https://developer.android.com/guide/topics/ui/accessibility/service

person Evgenii Vorobei    schedule 01.02.2018

Если вы тестируете определенный компонент своего приложения, такой как Activity, вы можете использовать InstrumentationTestCase. rel="nofollow">sendKeys()метод, передавая туда любую комбинацию ключей. Также вы можете использовать TouchUtils для имитации действий касания, перетаскивания и нажатия.

person Alex Bonel    schedule 14.12.2012

Моделирование для следующих ключей:

-BACK BUTTON: переопределить onBackPressed() в текущей активности.

-КНОПКА МЕНЮ: вы должны посмотреть здесь, а также openOptionsMenu(), меню

Вам также следует просмотреть этот блог.

person Anand Tiwari    schedule 15.12.2012
comment
Кнопка «Назад» не всегда закрывает текущее действие, особенно если действие onBackPressed реализовано по-другому. - person android developer; 30.04.2014
comment
Также это не сработает, если вы хотите имитировать нажатие кнопки как часть модульного теста. - person Martin; 28.12.2014

Попробуйте использовать метод переопределения android dispatchKeyEvent.

person KalanaChinthaka    schedule 13.07.2020

Используйте onKeyListener для переопределения физических кнопок на вашем устройстве. См. документ.

Класс KeyEvent содержит все значения для физических кнопок и экранной клавиатуры. на вашем устройстве. Например, KeyEvent.KEYCODE_HOME заменяет кнопку "Домой" на устройстве.

Погуглите, найдете много примеров для KEYCODE событий

person Renjith    schedule 14.12.2012

Попробуйте это ваше занятие

public boolean onKeyDown(int keyCode, KeyEvent event)   
{
 if (keyCode == KeyEvent.KEYCODE_BACK)
 {

 }
 if (keyCode == KeyEvent.KEYCODE_HOME)
 {

 }
 if (keyCode == KeyEvent.KEYCODE_MENU)
 {

 }
 if (keyCode == KeyEvent.KEYCODE_VOLUME_UP)
 {

 }
 if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN)
 {

 }
}
person Rajesh Rajaram    schedule 14.12.2012
comment
Большое спасибо, но я не хочу выбирать событие кнопок, а имитировать их - person Meroelyth; 14.12.2012
comment
неправильное направление .. в вопросе четко говорится, что имитировать, а не ловить - person baash05; 03.02.2013