5

我想模拟我们 Android 设备的所有物理按钮。

那么有没有办法模拟:

  • 返回键
  • 主页按钮
  • 菜单按钮
  • 搜索按钮
  • 任务按钮
  • 音量(+ 和 -)按钮
4

7 回答 7

17

创建一个 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);
于 2012-12-14T09:56:48.700 回答
2

即使您的应用程序已关闭,您也可以模拟按下按钮,但您需要 Accessibility 权限:

创建从以下扩展的服务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>

可访问性_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/services.html

于 2018-02-01T15:59:58.653 回答
0

模拟以下键:

-BACK BUTTON:覆盖当前活动中的 onBackPressed()。

-MENU BUTTON : 你应该看看这里还有 openOptionsMenu(), menu

你也应该看看这个博客。

于 2012-12-15T05:17:32.520 回答
0

如果您测试应用程序的特定组件,例如,Activity您可以使用InstrumentationTestCase'sendKeys()方法,将任意键组合传递给那里。你也可以TouchUtils用来模拟点击、拖动和点击动作

于 2012-12-14T09:58:41.923 回答
0

尝试使用 android dispatchKeyEvent 覆盖方法。

于 2020-07-13T02:14:34.137 回答
-1

用于onKeyListener覆盖设备中的物理按钮。请参阅文档

KeyEvent类具有设备上物理按钮和屏幕键盘的所有值。例如KeyEvent.KEYCODE_HOME替代设备中的主页按钮。

谷歌一下,你可以找到很多KEYCODE事件的例子

于 2012-12-14T10:07:47.340 回答
-2

试试这个你的活动

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

 }
}
于 2012-12-14T10:16:55.157 回答