【问题标题】:Check volume button usage when screen is off屏幕关闭时检查音量按钮的使用情况
【发布时间】:2016-05-29 15:07:33
【问题描述】:

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

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

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

有谁知道是否有办法检测这些按钮点击 屏幕关闭了? 来源:AV695's question

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

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

【问题讨论】:

  • 您是否有任何似乎可以做到这一点的例子,这表明它甚至是可能的?除了应用程序 CPU 正在运行但屏幕关闭的有限情况之外,是否有任何迹象表明内核被唤醒并意识到该键已被按下这一事实?如果不是硬件或至少需要无线电固件模块。只有当/当内核知道关键事件时,它才会成为说服平台让你的代码知道它的问题。
  • 很遗憾我没有。我唯一能想到的就是媒体播放器。我开始相信我的想法很简单(检查通知而不必从口袋里拿出手机,只需按下音量按钮,如果您有待处理的通知,设备就会振动)很简单创建太复杂。
  • 如果状态栏中有新通知(包括来自 3rd 方应用的自定义通知),LED 通常不会闪烁吗?
  • 是的,但这是一个自定义请求,由某个懒得从口袋里拿出手机来检查通知的人提出。听起来很简单,但结果却相当棘手。
  • 注册处理程序应该可以工作,但我认为这是特定于平台的错误。也许在 2.1 以下的设备上无法工作。但是姜饼及以上的工作

标签: android button volume


【解决方案1】:

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

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

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


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


您提到这是一个自定义请求:如果暗示它是一次性的或小批量的,那么需要考虑的另一种选择是一些供应商提供“蓝牙手表”并带有一个 SDK,可让您从 Android 设备推送通知。

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

【讨论】:

  • 感谢您的广泛评论。可悲的是,我想我会停止思考这个小项目并继续前进,可能在遥远的将来再试一次,这样的事情会更容易一些。这是其中之一“天啊,你知道什么会很酷吗?”来自一个随机的在线陌生人的想法,所以我认为蓝牙手表的想法有点太多了。谢谢你的想法:)
  • 在实际使用唤醒锁时你会怎么做?在我看来,一旦屏幕关闭,活动就会暂停并且没有键被传递?
【解决方案2】:

当您的应用程序处于后台时,您不能拦截密钥,而是监听 KeyPress 本身。您可以注册一个 ContentObserver,如this question 中所述。

【讨论】:

    【解决方案3】:

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

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

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

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

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

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

    【讨论】:

      【解决方案4】:

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

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

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

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

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

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

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

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

      【讨论】:

        【解决方案5】:

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

        Allowing applications to play nice(r) with each other: Handling remote control buttons

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

        总之你应该使用registerMediaButtonEventReceiver

        【讨论】:

        • 有什么理由相信这些方法可以在屏幕关闭的情况下工作?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-29
        • 1970-01-01
        相关资源
        最近更新 更多