2012-08-14 47 views
8

框架的一些部分对我来说还不是很清楚。我熟知输入事件的流程(内核 - > Eventhub - > InputReader - > InputDispatcher - > ...)。Android键处理(框架)

形势

(要求:处理输入键在不改变Android框架) 我想处理从设备(键盘/游戏手柄/控制器/ ...),但未来的关键事件有是一些要求。首先,我不想更改Android框架。这意味着,我不想扩展WindowManagerPolicy及其功能,如interceptKeyBeforeDispatching,其中家庭密钥正在处理。这将导致关键事件被分派到应用程序层,这很好。缺点是,我在这里有另一个棘手的要求。 示例:当我在玩愤怒的小鸟时,我在连接的输入设备上按下GoToAlpha按钮时,Alpha应用程序必须启动。愤怒的小鸟不知道哪个按钮是GoToAlpha,不会处理/识别它,并且例如没有意图广播来启动我的Alpha应用程序。

问题

有没有一种方式,它被分派后处理我的(自定义)按键事件,知道在前台的应用程序无法处理的关键?

我的(失败的)解决方案

  • 创建一个将处理的关键事件的服务。这是不可能的,因为像愤怒的小鸟这样的应用程序不会绑定到我的服务上,关键事件不会被我的服务所捕获。如果我错了,请提供更多信息:)。

  • 创建一个外部库,允许我的应用程序的活动从我自己的ActivityBase继承。所有关键事件和默认行为都可以在这里处理。缺点是,现有的应用程序不会支持我的自定义关键事件,因为它们不使用库。

  • 扩展框架将在我眼中是最干净的解决方案,但这将导致不符合我的要求。

任何帮助或有用的信息,将不胜感激

额外

如果第一个问题可以在这样或那样的..可以解决我想 定制我的GoToAlpha按钮后面的Intent。这意味着..通过 默认的Alpha应用程序将启动,但用户有 定制它后,Beta应用程序将从现在开始..任何 的想法?

感谢

+0

如果可以从其他应用程序捕获关键事件,这不是很奇怪吗?我想这会是一个安全风险 – Boy 2012-08-14 08:25:39

+0

是真的。一旦关键事件离开框架,它将只发送到一个应用程序并在那里处理。如果不是,则返回到框架。这意味着没有解决方案可以满足我的要求? – DroidBender 2012-08-14 08:32:13

+0

在我看来,仅仅因为安全问题,可能没有办法:处理关键事件,而您的应用程序没有焦点。也许唯一的办法是如果你实现一个Android键盘(我没有知道这一点)?这应该能够处理关键事件(当你选择第三方键盘时,用户也会指出这种安全风险) – Boy 2012-08-14 08:45:11

回答

3

感谢您对Victor的评论。

使用InputMethodService将不会为我提供足够的自由度和功能来处理我的问题。

我的解决方案/妥协

在Android框架,有一个PhoneWindowManager负责处理InputEvents。由SystemServer启动的WindowManagerService是该经理的所有者并创建实例。

通过创建我自己的自定义WindowManager并让它继承Android的PhoneWindowManager,我不会失去任何默认功能,这使我可以在此类中添加自己的实现。这个结果是向框架中添加一个新文件,并在Android Framework中只更改一行:WindowManagerService不会创建PhoneWindowManager,但会创建一个CustomPhoneWindowManager(扩展PhoneWindowManager)。

如果有人看到更好的解决方案或对我的妥协有任何具体的想法,请不要犹豫,以评论。 :)

+0

还有一个想法。我在某处听说过它,但我不记得结果在哪里,结果如何。您可以尝试创建透明窗口,该窗口将位于所有窗口之上,因此您将收到所有点击/键盘输入。而现在,您需要将它发送给应用程序就在您的后面。这样,您可以将问题从“接收所有输入”更改为将点击发送到其他应用程序。 – 2012-08-23 17:20:55

+1

这是一个相当危险的方法维克多,不会与一些安全标准冲突:)?另一个问题是,有些InputEvents(类似于KEYCODE_HOME)在框架内被捕获,并且不会被分派到应用层。这些事件甚至不会到达无形的窗口。感谢您的支持! – DroidBender 2012-08-24 07:18:08

+0

噢..是的..这很危险:)但是,我相信商业价值胜过80%的时间安全问题。我对整个InputMethodService的洞察力非常有限(只知道它的存在)。 – 2012-08-24 15:19:12

0

我怀疑这可能与公共的API(男孩和马亭指出,安全问题)。

最喜欢你最好的赌注(如果你不希望自定义Android设备)将

一)尽量使用InputMethodService(http://developer.android.com/reference/android/inputmethodservice/InputMethodService .html)

它不会给你想要的那种控制,但它可能足够满足一些需求。

b)尝试通过整个堆栈(从内核到应用程序)并找到一些使用的漏洞。

这绝对会花费很多时间,并不保证带来任何成果。