我不是在搜索特定的代码而不是提示从哪里开始我的研究。对于经验丰富的Android开发人员来说,我想做的事情可能很简单。
我只想记录比Dalvik引擎更低级别的所有硬件按钮交互。我对Android开发很陌生,我从未在Linux / Unix基础上开发过,但我在C语言方面的经验很少。
我经常发现人们会问他们如何使用他们的应用程序中的电源按钮,而我发现的一般情况是,由于系统本身会按下电源按钮并且至少不打算这样做不会将其交给Java VM中运行的应用程序或服务(与按下音量控制按钮不同,对于其关键事件,您可以注册监听器)。
然而,我想写一个简单的过程或任何适合账单记录所有按钮按钮(音量控制,电源按钮或设备上可用的任何硬件按钮)。既然我对这个话题很新,而且我的知识在这个时刻是有限的,我的第一个想法是要么有一个linux进程或内核扩展来完成这项工作。稍后我可能想要填写我自己的消息,事件或我之后可以通过JNI在应用程序或后台服务中接收的任何内容(如果我理解正确的话)。
因此,我的问题是:我需要做些什么来捕获硬件按钮交互并将它们用于我自己的目的(记录文本消息)而不会干扰默认的系统功能?一个库,一个进程,一个内核扩展或者我还没有想过的完全不同的东西?任何想法或提示都受到高度赞赏。
亲切的问候 Jan Thielemann
答案 0 :(得分:0)
在我做了更多研究之后,我发现Androids PhoneWindowManager.java方法interceptKeyBeforeDispatching是我可以自己进入的地方。
现在您要么必须更改此类并编译您自己的系统版本,要么可以使用xposed框架(在root设备上),并且它的方法挂钩也会收到有关事件的通知。
我使用了钩子beforeHookedMethod()方法来检查我感兴趣的KeyEvent事件。据我所知,我可以拦截KeyEvent(例如KeyEvent.KEYCODE_POWER)并执行我自己的代码但仍然让系统决定如何处理该事件。
我甚至可以检查模式(例如,按下3到5秒,然后短按不到1秒)来执行我的代码。通过按住电源5秒钟,系统仍然允许我关闭或重启设备,但我的代码也会被执行。