Android接收音频焦点更改广播



我正在尝试编写一个应用程序,该应用程序可以检测设备上任何应用程序何时开始或停止播放音乐。我的应用程序不是媒体播放器,它更像是一个仪表板功能,所以我不需要请求音频聚焦,但我想知道其他应用程序何时请求,这样我就可以相应地更新我的状态文本。

从本质上讲,我相信函数AudioManager.isMusicActive()将提供我想要知道的东西,但由于我正在编写一个永远打开的服务,我希望避免需要经常轮询它。我需要近乎实时的信息,所以这基本上是一次1秒的永久民意调查。

我正在寻找一种方法来检测STREAM_MUSIC何时被另一个应用程序使用。

我想过的一些方法:

(1) 同样,使用Timer或Handler不断轮询isMusicActive()函数的永久轮询。从电池或处理器管理的角度来看并不理想。我可以在UI活动中使用标志变量来控制轮询何时运行(不管怎样,当UI不在前台时,这并不是真正必要的),但我仍然认为我使用的处理器/电池时间比我需要的要多。

(2) 收听某种广播,但似乎没有一个Android音频广播真正符合要求。(我能找到的)

(3) 我想,我可以请求音频聚焦,永远不要播放任何音频,永远不要放弃。从理论上讲,由于我是在一个常开服务中启动的,我认为这应该允许我的应用程序位于LIFO音频焦点堆栈的底部,并且我会通过AudioManager.OnAudioFocusChangeListener机制收到通知,其方式基本上与其预期目的相反(即,当我失去音频焦点时打开我的应用,当我恢复音频焦点时关闭它)。然而,我不完全确定这样做在现实生活中会如何发挥作用。我觉得在我从未想过的情况下,滥用音频聚焦方法很容易导致负面的用户体验。

(4) 有没有一种方法可以使用AudioManager.OnAudioFocusChangeListener(或类似的)而不需要请求音频聚焦?

我还有其他方法可以做这件事吗?只要一个指向正确方向的指针就会非常有帮助!

我需要类似的东西,所以做了一些研究。不幸的是,除了在应用程序中请求音频聚焦之外,似乎没有其他方法可以实现这一点。

研究材料:

检查frameworksbasemediajavaandroidmedia中的Android源代码,在那里您可以在MediaFocusControl类中找到requestAudioFocus的实际代码。

该文件夹中的其他类显示了它们如何发送音量更改、蓝牙打开/关闭等广播事件,但根本没有与启用/禁用音频相关的广播事件。

关于主题的另一信息:

  • http://developer.android.com/training/managing-audio/audio-focus.html
  • http://developer.android.com/training/managing-audio/audio-output.html

除此之外,似乎没有任何记录在案的方法来知道音频硬件何时开始/停止播放。

我相信在没有实际播放音频的情况下请求音频聚焦不应该消耗任何电池。只有一个丑陋的副作用是,这停止了当前播放的音频。

最新更新