java - 安卓/Linux : Log (power) key usage on lower system level

标签 java android linux android-hardware

我不是在搜索一段特定的代码,而是在寻找从哪里开始研究的提示。对于经验丰富的 Android 开发人员来说,我想做的可能是一件容易的事。

我只是想在比 Dalvik 引擎更低的级别上记录所有硬件按钮交互。我是 Android 开发的新手,我从来没有在 Linux/Unix 基础上开发过,但我在 C 方面的经验很少。

我经常发现有人问他们如何在他们的应用程序中使用电源按钮,我发现通常这是不可能的,或者至少不打算这样做,因为系统本身会捕获电源按钮的按下,并且不会将其传递给在 Java VM 中运行的应用程序或服务(与按下音量控制按钮不同,您可以为其注册监听器的关键事件)。

但是,我想编写一个简单的过程或任何适合记录所有按钮按下的过程(音量控制、电源按钮或设备上可用的任何硬件按钮)。

现在,由于我对这个主题还很陌生,而且此刻我的知识有限,所以我的第一个想法是使用 linux 进程或内核扩展来完成这项工作。稍后我可能想填充我自己的消息、事件或任何我可以通过 JNI(如果我理解正确的话)在应用程序或后台服务中接收的内容。

所以这是我的问题:我需要做什么才能捕获硬件按钮交互并将它们用于我自己的目的(记录文本消息)而不干扰默认系统功能?库、进程、内核扩展或我还没有想到的完全不同的东西?非常感谢任何想法或提示。

亲切的问候 扬蒂勒曼

最佳答案

在我做了更多研究之后,我发现 Android 的 PhoneWindowManager.java 方法 interceptKeyBeforeDispatching 是我可以 Hook 的地方。

现在您要么必须更改此类并编译您自己的系统版本,要么您可以使用 xposed 框架(在 Root设备上)及其方法 Hook 来获得事件通知。

我使用 hooks beforeHookedMethod() 方法来检查我感兴趣的 KeyEvent 事件。据我所知,我可以拦截 KeyEvent(例如 KeyEvent.KEYCODE_POWER)并执行我自己的代码,但仍然让系统决定如何处理事件。

我什至可以检查模式(例如,按下 3 到 5 秒,然后短按不到 1 秒)来执行我的代码。按住电源 5 秒钟,系统仍然会提示我关闭或重启设备,但我的代码也会执行。

关于java - 安卓/Linux : Log (power) key usage on lower system level,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36996882/

相关文章:

java - 一些通过 Java 运行的终端命令在 Linux 中不显示输出

java - 如何使用 lambda 来初始化具有命名线程的 ThreadFactory

android - FBReaderJ 因 java.lang.UnsatisfiedLinkError : Library LineBreak not found 崩溃

regex - 正则表达式是否尝试匹配文本中字符之间的位置?

c - 如何获取网络设备统计信息?

java - GWT 在现有小部件上方添加一个小部件

java - 将对象转换为 ArrayList<String>

android - Android 中的 FBConnect 窗口泄露?

android - Activity 泄露了最初在这里注册的 IntentReceiver。您是否错过了对 unregisterReceiver() 的调用?

c++ - 作为日志旋转器通过管道传输到我的程序