【问题标题】:Android/Linux: Log (power) key usage on lower system levelAndroid/Linux:在较低系统级别记录(电源)键使用情况
【发布时间】:2016-05-03 06:12:19
【问题描述】:

我不是在寻找一段特定的代码,而是在寻找从哪里开始我的研究的提示。对于有经验的安卓开发者来说,我想做的事情可能很容易。

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

我经常发现有人问他们如何在他们的应用程序中使用电源按钮,而我发现一般来说这是不可能的,或者至少不应该这样做,因为系统本身会捕捉到电源按钮的按下和不会将其交给在 Java VM 中运行的应用程序或服务(与按下音量控制按钮不同,您可以为其键事件注册一个监听器)。

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

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

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

亲切的问候 扬·蒂勒曼

【问题讨论】:

  • 正如它所说,这听起来像是一个题外话,属于其他地方(例如,超级用户)。
  • 从 /dev/input/eventX 读取? (select(), poll()) - kernel.org/doc/Documentation/input

标签: java android linux android-hardware


【解决方案1】:

我做了更多的研究之后,我发现Androids PhoneWindowManager.java方法interceptKeyBeforeDispatching是一个我可以挂钩自己的地方。

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

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

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

【讨论】:

    猜你喜欢
    • 2020-07-21
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-28
    • 1970-01-01
    • 2021-10-22
    • 1970-01-01
    相关资源
    最近更新 更多