将键输入路由到不同的活动

时间:2013-05-17 12:42:43

标签: android input android-activity google-tv

首先让我先解释一下我的问题 -

我正在处理位于系统活动(com.google.tv.player.PlayerActivity)和用户空间之间的应用程序。

当我按MENU按钮时,系统活动会发生某种行为。由于我之间新部署的应用程序,我正在努力将MENU键事件发送到“我上面的活动”。否则,它只是被我的应用程序拦截和使用。

我没有参考活动。我有点检查它的旧代码,以确定菜单按钮按下最终调用void openOptionsMenu();并且大多数尝试都没有结果。这是我尝试过的简短列表,我在MyActivity.onKeyDown()中按下MENU按钮并尝试执行以下操作

  • super.onKeyDown(keyEvent);让我无处可去。
  • 使用dispatchKey调度密钥导致堆栈溢出,具体取决于使用情况
  • 使用menuEvent.dispatch((Activity) getRefByReflection());
  • 调度活动
  • 抓住WindowManager并将密钥发送给它。
  • 显然覆盖了dispatchKey,它刚刚在stackoverflow中结束:)

我在网上看过,有一种方法可以通过PID发送密钥 - 我可以获得玩家的pid,但缺少用于发送密钥的方法!我根本没有他们似乎正在使用的dispatchKey(KeyEvent event, int recvPID, int recvUID)

我也知道我会得到一些 伪造用户输入是不稳定的,重构按钮行为比模拟按下 更好,我同意但是,我无法获得消息来源,更不用说改变它。如果只知道我需要反映哪些成员,那么撤销它将是一种选择。

对我而言,似乎根本没有办法路由按键作为passthru并让它沉入下面的活动,所以我真的必须发送/发送< / strong>以某种方式。任何帮助都会非常感激。

再次,我正在寻找一种方法 允许按键传递,所有这些都是为了打开菜单 ,我无法以编程方式进行操作通过我的代码。

最后一个未经完全探索的选项是InputManager的{​​{1}}方法 - 但没有一种方法可以将它“引导”到任何地方,我不知道它是否会成果彻底探索那个场地。再说一次,这是唯一值得探索的事情。

值得注意的是,反射方法因失败而失败 injectInputEvent 所以也许(希望)它是某种类加载器问题?

我会尽快在这个问题上获得100个赏金,同时 - 请帮助:)我搜索过高低,并尝试了所有建议和我能想到的事情。目前我真的很难过。

3 个答案:

答案 0 :(得分:2)

根据Diane Hackborne的discussion had on android-developers mailing list引用

From: Dianne Hackborn (hack...@android.com)
Date:   Mar 11, 2011 5:24:06 pm
List:   com.googlegroups.android-developers

Correct you can't do this, very much by design. 

事实证明,允许外国应用程序将关键事件发送到其他应用程序是一个主要的安全风险。因此,需要以这种方式协同工作的应用程序还需要共享GroupID或PID。

结论:不幸的是,你所要求的东西目前似乎不可能。

答案 1 :(得分:0)

如果有任何封装代码,你可以发布它将有助于理解你的调用堆栈。从你给我的想法的描述是你应该从你的密钥处理程序返回false(什么方法实际上捕获按键)这将允许它从你提到的中间件冒出来。再一次,我不确定你的关键切入点,因为你没有提供签名或指示什么方法正在捕获按键。

答案 2 :(得分:0)

如果您打开GTV电视播放器APK,清单会引用几个库:

<uses-library android:name="com.google.android.tv" />
<uses-library android:name="com.google.tv" />
<uses-library android:name="com.google.tv.epg" />
<uses-library android:name="com.google.tv.mediadevices" />

不确定这是否会解决反射类加载器问题,但值得一试。