我正在尝试编写一个应用程序,可以检测设备上的任何应用程序何时启动或停止播放音乐。我的应用程序不是媒体播放器,它更像是一个仪表板功能,所以我不需要请求音频焦点,但我想知道其他应用程序何时这样做我可以相应地更新我的状态文本。
基本上,我相信函数AudioManager.isMusicActive()将提供我想要知道的内容,但是因为我正在编写一个永远在线的服务,所以我希望避免需要在不断的基础上进行轮询。我需要近乎实时的信息,所以它基本上是永久性的1秒轮询。
我正在寻找一种方法来检测其他应用程序何时使用STREAM_MUSIC。
我考虑过这样做的一些方法:
(1)同样,使用Timer或Handler进行永久轮询以不断轮询isMusicActive()函数。从电池或处理器管理的角度来看并不理想。我可以在UI Activity中使用一个标志变量来控制轮询运行的时间(当UI不在前台时,它确实没有必要),但我仍然认为我使用的处理器/电池时间比我需要。
(2)收听某种广播,但Android音频广播似乎都不符合要求。 (我能找到)
(3)我想,我可以请求音频焦点,不要播放任何音频,也不要放弃。从理论上讲,由于我是在一个永远在线的服务上开始这个我相信应该允许我的应用程序坐在LIFO音频焦点堆栈的底部,我会通过AudioManager.OnAudioFocusChangeListener机制通知基本上与其预期目的相反的方式(即当我失去音频焦点时打开我的应用程序,当我获得音频焦点时将其关闭)。但是,我不完全确定如何做这样的事情会在现实生活中起作用。我觉得滥用音频焦点方法对于这样的事情很容易在我甚至没想过的情况下导致负面的用户体验。
(4)有没有办法使用AudioManager.OnAudioFocusChangeListener(或类似的)而不需要请求音频焦点?
我还有其他方法可以做到这一点吗?只是一个正确方向的指针会非常有帮助!
答案 0 :(得分:0)
我需要类似的东西,所以做了一些研究。 不幸的是,除了在您的应用中请求音频焦点外,似乎没有其他方法可以实现此目的。
学习材料:
检查frameworks\base\media\java\android\media\
中的Android源代码,您可以在MediaFocusControl类中找到requestAudioFocus的实际代码。
此文件夹中的其他课程显示他们如何发送音量变化,蓝牙开/关等广播事件,但没有与音频启用/禁用相关的广播事件。
关于主题的另一个信息:
除此之外,似乎没有任何记录方式可以知道音频硬件何时开始/停止播放。
我相信在没有实际播放音频的情况下请求音频焦点不应该消耗任何电池。只有一个丑陋的副作用是,这会阻止当前播放的音频。