6

I want to simulate all physical buttons of our Android devices.

So is there a way to simulate:

  • BACK BUTTON
  • HOME BUTTON
  • MENU BUTTON
  • SEARCH BUTTON
  • TASK BUTTON
  • VOLUME (+ AND -) BUTTONS
Kara
  • 6,115
  • 16
  • 50
  • 57
Meroelyth
  • 5,310
  • 9
  • 42
  • 52

7 Answers7

17

Create a KeyEvent and publish it.

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);
Aleksander Gralak
  • 1,509
  • 10
  • 26
  • Many thanks..but I want to do this programmatically and not only from an activity... – Meroelyth Dec 14 '12 at 16:46
  • 4
    This is exactly "programmatically" and you can always have a reference of your activity to call this method (you are not forced to call it within your activity). – Raphael Royer-Rivard Dec 26 '13 at 19:47
  • @Aleksander Gralak : Your code does not call the `activity.onBackPressed` method btw... – Raphael Royer-Rivard Dec 26 '13 at 21:03
  • 2
    You need to call it for both action down and action up. Like so this.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK)); this.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_BACK)); – Katianie May 16 '14 at 23:30
  • this method doesn't work anymore: ``` ComponentActivity.dispatchKeyEvent can only be called from within the same library group prefix(referenced groupId=androidx.core)``` – Mneckoee May 10 '22 at 17:19
3

You can simulate pressing buttons even your app is closed, but you'll need Accessibility permission:

Create service extended from 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)
    }
}

Call doAction() where you want action

Add to 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" />

for more info look at https://developer.android.com/guide/topics/ui/accessibility/services.html

Renetik
  • 5,887
  • 1
  • 47
  • 66
Evgenii Vorobei
  • 1,457
  • 18
  • 20
0

If you test your application's specific component such as Activity so you may use InstrumentationTestCase's sendKeys()method, passing there any combination of keys. Also you can use TouchUtils to simulate tapping, dragging and clicking actions

Alex Bonel
  • 1,344
  • 1
  • 9
  • 22
0

Simulation for following keys:

-BACK BUTTON : override onBackPressed() in current activity.

-MENU BUTTON : you should look here and also openOptionsMenu(), menu

you should also look at this blog.

Community
  • 1
  • 1
Anand Tiwari
  • 1,583
  • 10
  • 22
0

Try using android dispatchKeyEvent override method.

KalanaChinthaka
  • 323
  • 4
  • 13
-1

Use onKeyListener for overriding the physical buttons in your device. See the doc.

The KeyEvent class have all the values for the physical buttons and on screen keyboard on your device. For Example KeyEvent.KEYCODE_HOME substitutes for the home button in the device.

Google it, you can find a lot of examples for KEYCODE events

Renjith
  • 5,783
  • 9
  • 31
  • 42
-2

Try this your activity

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)
 {

 }
}
Rajesh Rajaram
  • 3,271
  • 4
  • 29
  • 48