当前位置: 首页 > 知识库问答 >
问题:

Android接收音频焦点更改时的广播

公冶谦
2023-03-14

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

本质上,我相信函数AudioManager.isMusicActive()将提供我想知道的东西,但是由于我正在编写一个将一直打开的服务,我希望避免需要不断地轮询它。我需要近实时的信息,所以它本质上是一个永久的1秒钟的投票。

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

我考虑过这样做的一些方法:

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

(2) 收听某种广播,但Android系统的音频广播似乎都不符合要求。(我能找到)

(3) 我想,我可以要求音频聚焦,但决不播放任何音频,决不放弃。理论上,由于我是在一个始终在线的服务中开始这项工作的,我认为这应该允许我的应用程序位于后进先出音频聚焦堆栈的底部,我会通过AudioManager得到通知。OnAudioFocusChangeListener机制基本上与其预期目的相反(即,当我失去音频焦点时打开应用程序,当我重新获得音频焦点时关闭应用程序)。然而,我并不完全确定这样做在现实生活中会起什么作用。我觉得滥用音频聚焦方法来做类似的事情很容易在我甚至没有想到的情况下导致负面的用户体验。

(4)有没有办法使用AudioManager.OnAudioFocusChangeListener(或类似)而不需要请求音频焦点?

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

共有1个答案

阎鸿煊
2023-03-14

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

学习材料:

检查框架中的Android源代码\base\media\java\android\media\,您可以在其中找到MediaFocusControl类中请求AudioFocus的实际代码

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

关于主题的其他信息:

    < Li > http://developer . Android . com/training/managing-audio/audio-focus . html < Li > http://developer . Android . com/training/managing-audio/audio-output . html

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

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

 类似资料:
  • 我有一个音乐播放器活动来控制歌曲的播放。我已经阅读了有关管理音频焦点的文档,并在

  • 我使用SimpleExoPlayer实现了一个测试应用程序,它运行良好。我现在想把audiofocus添加到我的应用程序中。 当用户启动应用程序时,开始播放音频焦点是很容易的。在onCreate()的末尾添加通常的代码: 很好用。 但是当用户按下播放按钮时,我无法请求audiofocus,我记得播放按钮是由PlaybackControlView封装的。 重新划分SimpleExoPlayer.se

  • 如果我在任何Android音乐播放器中播放音乐,然后用介绍视频启动我的应用程序(用MediaPlayer处理)音乐停止。我想避免(音乐继续播放),因为我的应用程序介绍视频本身没有声音。 当MediaPlayer启动它的内容时,是否可以避免获得音频焦点?(MediaPlayer.start()-->AudioManager为音乐播放器分派一个AudioFocusChange)

  • 请问,有任何简单的方法流(广播)媒体文件(ogg,mp3,SPX..)通过Node.js和Socket.io从服务器到客户机(浏览器)?

  • 我目前正在开发一个播放视频的应用程序,一些原生的,一些HTML5。对于原生视频,我使用ExoPlayer来播放视频,但有些源不提供原始视频文件,所以这些必须在WebView中作为HTML5视频播放。所有视频都以静音开始播放,如果用户取消静音视频,我获得音频焦点。这在ExoPlayer视频中非常有效,但是WebView在视频播放开始时就获得了音频焦点。

  • 如果触发了多个通知,那么由于NOTIFICATION_ID是相同的,所以它不会更新。 有没有办法知道有多少通知被激发了?以便我可以相应地更新我的通知。 我不想单独发出通知。我想更新现有的通知。在这里,我只需要计算出在触发通知时已经触发的通知数。当用户点击它时,该号码应该重置。