我有一个应用程序,它通常是使用设备(Android 4.2 及更高版本)的唯一应用程序。在以下情况下,它需要能够接受来自音量摇杆的输入:
- 应用程序在前台
- 应用程序在后台
- 锁屏或键盘锁已启用
- 屏幕已关闭(即空闲模式)。
(1)通过监听Activity中的KeyDown事件很容易解决
(2) 可以通过侦听部分解决android.media.VOLUME_CHANGED_ACTION
(是的,我知道它不是公共 API,但它适用于我设法对其进行测试的所有设备,但我找不到替代品)。但是在我的 Nexus 5 (Android 6.0) 上,第一次按下摇杆时,它会在短时间内显示音量对话框,并且需要第二次按下才能将摇杆事件传递给我的应用程序。我还没有设法确定这开始发生的 Android 版本,但我想研究如何确保所有 Android 版本的第一个事件都传递给我的应用程序。
(3) 可以通过使用 WindowManager 来缓解FLAG_DISMISS_KEYGUARD
并FLAG_SHOW_WHEN_LOCKED
避免锁屏和键盘保护
(4) 可以通过使用 WindowManagerFLAG_KEEP_SCREEN_ON
在应用程序处于前台时忽略显示超时来部分缓解。但不幸的是,用户不小心手动关闭屏幕电源是很常见的事件,即使使用 aWAKE_LOCK
也不允许 android.media.VOLUME_CHANGED_ACTION
在屏幕空闲时接收音量摇杆事件。
所以问题是:
- 如何确保第一次按下音量键会传递给我的应用程序,而不是被音量对话框捕获和消耗?
- 屏幕空闲时如何接收音量摇杆事件?