3

让我首先解释我的问题 -

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

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

我没有提及该活动。我已经检查了它的旧代码,以确定按下菜单按钮最终会调用void openOptionsMenu();,并且大多数尝试都没有结果。这是我尝试过的简短列表,我按下 MENUMyActivity.onKeyDown()并尝试执行以下操作

  • super.onKeyDown(keyEvent);让我真的无处可去。
  • dispatchKey根据使用情况分派导致堆栈溢出的密钥
  • 调度事件menuEvent.dispatch((Activity) getRefByReflection());
  • 抓住 WindowManager 并调度它的关键。
  • 显然是压倒一切dispatchKey的,这刚刚以堆栈溢出结束:)

我在网上读到有/曾经有一种方法可以通过 PID 发送密钥 - 我可以获得玩家的 pid,但缺少用于发送密钥的方法!我根本不dispatchKey(KeyEvent event, int recvPID, int recvUID)知道他们似乎在使用。

我也知道我会得到一些虚假的用户输入是不稳定的,重构按钮行为比模拟按下它更好,我同意但是,我什至无法获得源代码,更不用说改变它。扭转它是一种选择,如果只是为了知道我需要反省哪些成员。

对我来说,似乎根本没有办法将按键作为通路路由并让它沉入下面的活动,所以我真的必须以某种方式发送/调度它。任何帮助将非常感激。

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

最后一个未完全探索的选项是InputManager'injectInputEvent方法 - 但如果没有在任何地方“引导”它的方法,我不知道彻底探索该场所是否会结出果实。话又说回来,这是唯一需要探索的东西。

可能值得注意的是,反射方法失败是因为 Caused by: java.lang.ClassNotFoundException: Didn't find class "com.google.tv.player.PlayerActivity" on path: /system/app/myAPK.apk (希望)这是某种类加载器问题?

在此期间,我将尽快在这个问题上奖励 100 赏金 - 请帮助 :) 我搜索了如此高和低的东西,并尝试了所有建议的东西和我能想到的东西。此刻我真的很难过。

4

3 回答 3

2

根据 Diane Hackborne 关于android-developers 邮件列表引用的讨论

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。

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

于 2013-05-27T14:39:51.820 回答
0

如果您解压 GTV TV Player 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" />

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

于 2013-05-22T00:00:40.030 回答
0

如果您可以发布任何封装代码,它将极大地帮助您理解您的调用堆栈。根据您给出的描述,我的想法是您应该从您的键处理程序中返回 false (无论哪种方法实际上都在捕获按键),这将允许它从您提到的中间件中冒出来。同样,我不确定您的关键入口点,因为您没有提供签名或指示捕获按键的方法。

于 2013-05-19T03:06:24.813 回答