13

对于这个问题,我将引用另一个没有回答他们的问题的用户:

我编写了一个将硬件音量按钮用于其他目的的 Andoid 应用程序。

如果应用程序正在运行并且可见,它工作正常,但是当我关闭屏幕或让它超时时,按钮点击不会进入我的处理程序。

有谁知道屏幕关闭时是否有办法检测这些按钮点击?来源:AV695的问题

我自己正在开发一个使用音量按钮的应用程序,但正如该用户还指出的那样,一旦屏幕关闭,使用 onKeyPress 检查按钮的正常行为就会停止工作。这是因为 Activity 在屏幕关闭时暂停。

有没有办法在屏幕关闭时保持活动运行,或者在屏幕关闭时检查音量按钮的使用情况?我之前尝试过为此使用服务,但无法像 Commonsware 所指出的那样检查音量键。

4

5 回答 5

6

我怀疑这在平台、内核或底层无线电固件级别是否受支持(无需使用耗尽电池的唤醒锁),而无需修改最后一个以引起内核注意睡眠期间的音量按压。

在合理的系统 ROM 修改范围内,更合理的做法可能是修改现有的开源 ROM 以使设备在电源按钮的处理中插入一些自定义平台级代码,该按钮通常用于唤醒设备以准备解锁它——至少我们知道它确实引起了内核的注意。如果有未确认的通知,该代码可以通过声音或振动通知用户。

您可以选择短暂等待、检查设备方向或寻找另一个按键以避免在用户将设备放在口袋外面并尝试解锁时以令人讨厌的方式执行此操作。


或者您不能使用音量键,只需设置一个定时器,每 15 分钟唤醒一次,并在有未确认通知时振动,避免在口袋里摸索。


您提到这是一个自定义请求:如果暗示它是一个关闭或小批量,另一个需要考虑的选择是一些供应商使用 SDK 提供“蓝牙手表”,让您从 android 设备推送通知。

如果您可以在通知生成时捕获通知,则可以将其推送到用户的手腕上,然后让手机重新进入睡眠状态。

于 2012-04-28T02:09:18.253 回答
2

当您的应用程序在后台时,您不能拦截密钥,而是收听 KeyPress 本身。您可以注册一个 ContentObserver,如此问题中所述。

于 2012-04-30T22:09:39.017 回答
0

正如 Chris Stratton 所提到的,让您的应用程序保持活力的唯一方法是使用耗电的唤醒锁。

然而,由于我发现自己处于同样的情况,我想出了另一个解决方案。不幸的是,您需要有根设备以及 Xposed 框架。

使用 Xposed 替代了 zygot 进程,因此您可以将自己挂接到系统的任何构造函数和方法中,您将能够在系统处理原始 KeyEvent 之前捕获它们。

这是在 PhoneWindowManager.interceptKeyBeforeQueueing() 中完成的。通过使用 XC_MethodHook,您可以在上述方法上使用 beforeHookedMethod() 来捕获每个硬件按钮事件,即使设备处于深度睡眠状态。

捕获您感兴趣的事件后,您可以创建一个临时唤醒锁来做您的事情,但不要忘记在完成工作后释放唤醒锁。

如何实现这一点的一个很好的例子是Xposed Torch模块。但是,如果您依赖无根系统,那么坏消息是,如果不耗尽电池就不可能......

于 2016-05-23T02:00:42.787 回答
0

我还尝试在我的应用程序中实现音量按钮按下检测,一旦核心部分完成,我就将该部分留待以后开发。即使手机被锁定,我也能够从后台服务检测到屏幕开启时的音量键按下。

Background Video Recorder 2 (BVR2)(也可能是 BVR1,我没有尝试过)是即使在屏幕关闭时也可以检测音量键按下的应用程序之一。在我的应用程序中尝试在屏幕关闭时实现音量键检测时,我安装了 BVR2,希望能找到它的工作原理。令我惊讶的是,即使屏幕关闭,它也让我的应用程序能够检测到音量键。我的应用程序有一个 ContentObserver 来监控音量变化,但在屏幕关闭时无法正常工作。当 BVR2 处于活动状态时,我的应用程序还可以在屏幕关闭时检测到音量键按下。还在挖。

但是 BVR2 有自己的触发动作,即录制视频,您可能不希望发生这种动作,只是为了让您的应用程序检测到音量键按下。

另一个应用程序是 QuickClick。这个应用程序可以为您的应用程序提供它所缺乏的功能,即使在屏幕关闭时也可以检测音量键按下,而无需额外的不必要的操作。只需安装 QuickClick,无需配置任何操作。创建一个ContentObserver来监控流体积变化,你就准备好了。即使屏幕关闭,您的应用程序现在也能够检测到音量键按下。

请注意,我的应用程序作为后台服务运行。

上面提到的两个应用程序都用于其他用途,但使用音量键检测来执行操作。我绝不会连接到提到的任何应用程序。

如果这些应用程序(可能还有其他几十个应用程序)可以检测到音量键按下,则可以完成。我要求专家找出如何做到这一点,以便我们可以在我们的应用程序中实现而不依赖另一个应用程序。

如果您觉得这个答案有用,请投票。

于 2016-05-28T18:37:49.950 回答
-1

我不确定它是否像这样简单,但请查看这个 android 博客:

允许应用程序相互播放 nice(r):处理遥控器按钮

它解释了接收上/下音量控制和其他音乐控制的广播接收器的用法。

总之,您应该使用registerMediaButtonEventReceiver

于 2012-04-26T22:38:10.247 回答