Android手柄应用dispatchKeyEvent到另一个应用(游戏)



我正在为一个学校项目开发一个游戏控制器应用程序,该应用程序显示一个虚拟游戏手柄,旨在控制Android上的任何游戏应用程序。当然,游戏应用应该支持监听keyeevents。我使用Java直接为Android开发。

我发现了许多关于如何处理控制器动作和接收keyeevents(游戏方)的资源,但是很难找到关于另一方的信息-如何实际将这些keyeevents从一个应用程序(控制器)发送到另一个。

到目前为止我所取得的成就:

dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_UP));

这是我用来调度KeyEvent的函数,例如,我想将字符向前移动一步。

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
System.out.println("Input received "+ keyCode);
return super.onKeyDown(keyCode, event);
}

我在自己的控制器应用程序中使用上面的代码来检查我是否实际发送并能够接收输入。

当我运行我的代码并调用dispatchKeyEvent函数时,我得到控制台输出,说我自己的应用程序接收到了键输入。所以它是这样工作的

问题是输入不能用于控制另一个应用程序。我离开我的控制器应用程序每2秒调度一次KeyEvent,我退出应用程序,控制台继续记录输入正在被接收(由我自己的应用程序,在后台运行),但当我进入游戏应用程序时它不工作。游戏应用程序不响应正在调度的KeyEvents。我用另一个虚拟控制器应用程序尝试了这个游戏,它工作得很好,所以游戏能够接收控制器输入。我还尝试从我的控制器应用程序中删除KeyEvent监听器(看看它是否干扰了KeyEvent接收),但没有积极的结果。

所以我的问题是:发送keyeevents到Android的正确方式是什么,以便它将输入传递给其他应用程序侦听?这是控制器按键输入的工作方式吗?

我想提前感谢你的时间。

像GameKeyboard +这样的应用程序可以做到这一点,但需要root来创建虚拟手柄。据我所知,没有Android API,所以你可能需要使用uinput来创建一个虚拟设备,并生成可以被其他应用程序看到的输入事件。

最新更新