【问题标题】:How can I send key events in android?如何在android中发送关键事件?
【发布时间】:2012-10-23 08:39:53
【问题描述】:

我正在为 Android 4.0.3.r1 制作一个自定义导航栏,并希望发送诸如“Home”和“Back”之类的关键事件。因此,我的应用程序不是系统:

IWindowManager mWindowManager = IWindowManager.Stub.asInterface(
                ServiceManager.getService(Context.WINDOW_SERVICE));
mWindowManager.injectKeyEvent( ev, false );

它不起作用,因为我无法从非系统应用程序中获取android.permission.INJECT_EVENTS。我该怎么做?

【问题讨论】:

  • 有人从“如何在 android 中发送关键事件?”中编辑了我的问题。到“如何处理 android 中的关键事件?”所以我想知道如何发送关键事件。

标签: android android-event


【解决方案1】:

这里有一些精确到Roman的答案

BaseInputConnection  mInputConnection = new BaseInputConnection( findViewById(R.id.main_content), true);
KeyEvent kd = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MENU);
KeyEvent ku = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MENU);
mInputConnection.sendKeyEvent(kd);
mInputConnection.sendKeyEvent(ku);

【讨论】:

  • 是否可以发送任何类型的密钥?所有 unicode 字符?
【解决方案2】:
BaseInputConnection  mInputConnection = new BaseInputConnection(targetView, true);
mInputConnection.sendKeyEvent(new KeyEvent(...));

【讨论】:

  • 嘿,在这种情况下,targetView 是什么以及如果用户在主屏幕上如何提取它。谢谢
【解决方案3】:

对我有用:

public static void simulateKey(final int KeyCode) {

    new Thread() {
        @Override
        public void run() {
            try {
                Instrumentation inst = new Instrumentation();
                inst.sendKeyDownUpSync(KeyCode);
            } catch (Exception e) {
                Log.e("Exception when sendKeyDownUpSync", e.toString());
            }
        }

    }.start();
}

【讨论】:

  • Wnen 我使用这些方法它给了我关于 INJECT_EVENTS 权限的错误。所以我关注了这个帖子:stackoverflow.com/questions/5383401/…。当我在清单文件中包含权限 android.permission.INJECT_EVENTS 时,它会抛出一个错误,即权限被授予系统应用程序。如何包含此权限?谢谢
【解决方案4】:

你可以试试这个

try
{
    String keyCommand = "input keyevent " + KeyEvent.KEYCODE_MENU;
    Runtime runtime = Runtime.getRuntime();
    Process proc = runtime.exec(keyCommand);
}
catch (IOException e)
{
    // TODO Auto-generated catch block
    e.printStackTrace();
}

当然,你可以选择命令input text ...来输入文字。

【讨论】:

  • 嗨,我尝试使用它来实现我的后退按钮,但它不起作用。我正在为 Android 4.4.3 构建。我已经搜索了一周,但到目前为止没有成功。谢谢
  • 如果使用此方法,需要获取root权限
  • 这需要 root 作为 Runtime.getRuntime().exec(new String[] { "su", "-c","input keyevent "+KeyEvent.KEYCODE });
【解决方案5】:

这些都不是有效的。从使用下面的代码转到主屏幕。

Intent home = new Intent(Intent.ACTION_MAIN);
home.addCategory(Intent.CATEGORY_HOME);
//home.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(home);

如果您不是从活动/片段调用,您可能需要取消注释标志部分。 回到下面的代码适用于某些设备。

dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK));
dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_BACK));

如果这有帮助,请告诉我!

【讨论】:

  • KEYCODE_BACK 用于模拟后退按钮动作,生成点击事件需要 ACTION_DOWN 和 ACTION_UP。
【解决方案6】:

我之前也遇到过同样的问题,下面我解决了KEY_INJECT_EVENT_PERMISSION问题。

第 1 步:您需要获取设备 ROM 的签名(对我来说文件名为 signapk)。

第二步:接下来需要获取platform.pk8和platform.x509.pem文件。

第 3 步:生成应用程序的调试 apk。

第 4 步:将以上所有文件放在一个文件夹中。

第 5 步:获得所有上述文件后,运行下面提到的命令。

java -jar signapk.jar platform.x509.pem platform.pk8 your_debug_app.apk customname.apk

第 6 步:在此之后,您可以在同一文件夹中获得一个签名的 apk (customname.apk)。一旦您获得该文件,请运行以下命令。

adb install -r app-release-signed.apk

第 7 步:现在将启用 Inject_Event_Permisson。

【讨论】:

    【解决方案7】:

    还有InputConnectionsendKeyEvent函数。 InputConnection 只是 API 级别 3。

    【讨论】:

      【解决方案8】:

      恢复旧线程 - 您可以使用相对较新的 Accessibility API 执行 Home and Back - 在此处查看“performGlobalAction”: http://developer.android.com/reference/android/accessibilityservice/AccessibilityService.html

      (特别是 GLOBAL_ACTION_HOME 和 GLOBAL_ACTION_BACK 操作)

      当然,您需要为无障碍服务提供适当的权限,但这不需要 root

      【讨论】:

      • 我不想听事件,我想发送事件(返回键),如何使用 AccessibilityService 在代码中实现?
      【解决方案9】:

      你可以试试这个。

      long now = SystemClock.uptimeMillis();
      BaseInputConnection mInputConnection = new BaseInputConnection(findViewById(R.id.MainActivity), true);
      KeyEvent down = new KeyEvent(now, now, KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_HOME, 0);
      mInputConnection.sendKeyEvent(down);
      

      这段代码可以为我工作。

      注意:请记住将“R.id.MainActivity”替换为您的 Activity 名称。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-14
        • 1970-01-01
        • 1970-01-01
        • 2021-06-16
        • 2012-02-06
        相关资源
        最近更新 更多