gpt4 book ai didi

java - 如何检测其他应用程序是否正在播放音乐?

转载 作者:行者123 更新时间:2023-12-04 11:05:56 26 4
gpt4 key购买 nike

我正在制作游戏,我想在我的游戏运行时检测其他东西是否已经在播放音乐(或开始播放音乐)。如果是这样,我会淡出游戏中的音乐并继续播放音效。我正在使用 Unity 和 FMOD 进行音频播放。
据我所知,Android 提供了两种不同的方法来做到这一点:AudioManager.isMusicActiveAudioManager.OnAudioFocusChangeListener .AudioManager.isMusicActive不适用于我的特殊情况,因为 Unity/FMOD 注册本身的方式似乎会使 always return true .AudioManager.OnAudioFocusChangeListener让我检测另一个应用程序是否请求音频焦点,但无法检测我是否可以安全地再次请求它。
我不了解 Unity/FMOD 如何设置 Audio Session ,但默认是播放声音,而不考虑在后台播放的任何其他内容。所以,如果我只知道是否有其他东西在播放,这将很容易!
有没有办法判断我自己的应用程序以外的东西是否正在播放音乐?
注意:当我说音乐时,它也可能是有声读物、播客或最接近的等价物。
似乎有可能寻找任何正在进行的媒体播放通知,但这需要升级的权限,这对于这么小的功能来说似乎太大了。
以下是一些解决方案的候选者:

  • AudioFocusRequest.setAcceptsDelayedFocusGain这可以是
    在请求音频焦点时指定,但仅表示我没有
    现在需要重点,以后也可以。但是,如果还有什么
    播放未“锁定”的音频我会窃取音频焦点,停止它并且在此过程中不给我更多信息。
  • AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK最初看起来很有希望,但
    因为这取决于请求音频焦点的其他应用程序来指定
    本身是 transient 的(即通知声音或类似声音)并提供
    检测更长的外部音频播放对我没有任何好处。
  • BroadcastReceiver/MediaNotifications,这里是 Spotify implementation , 但尽我所能
    可以看出,这需要我的应用程序内部为我想要确认的每个玩家提供特定支持,以及用户启用广播。可能有效,但似乎很脆弱。
  • 最佳答案

    要先回答您的大胆问题,您可以尝试使用 requestAudioFocusAUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE旗帜。 Exclusive 意味着没有其他东西可以播放,因此应该返回 AUDIOFOCUS_REQUEST_FAILED 或 AUDIOFOCUS_REQUEST_GRANTED ,这应该给你一个代理回答你的问题“除了我自己的应用程序播放音乐”。
    您是正确的,监听器并不是要告诉您是否可以安全地请求访问,但他们可以告诉您何时可以安全地开始播放。只要在您的应用程序最初加载或前台时发出请求(假设它尚未播放音乐)。如果你被批准了,就玩,如果没有就不要玩。如果您没有立即访问,请不要担心,因为您可以有一个监听器等待稍后授予您访问权限(即在 map 结束后几秒钟后发出指示,或几分钟后当其他长期音频源停止)..
    据我了解,这是一个更长的生命周期。
    一旦你的应用程序启动(或无论何时它被置于前台),请求 AUDIOFOCUS_GAIN。如果没有播放,您将获得音频焦点并可以开始播放。如果正在播放某些内容,您可能无法立即获得音频焦点并且不应开始播放。如果您没有开始播放,请确保在 FocusChangeListener 中收听“AUDIOFOCUS_GAIN”。收到此消息意味着您可以开始玩了!
    不要担心“锁定”其他人。只要您在请求 AUDIOFOCUS_GAIN 时提出了合理的请求(这是合理的,因为您计划将音频用于您的游戏并且您计划使用它超过 15 秒)然后从另一个应用程序接管音频是有意义的,因为您的应用程序是被前景化并且应该接管主音频。但是,在您的 OnAudioFocusChangeListener 中,您应该是一个好公民,并在用户切换回 OTHER 应用程序或其他事情暂时弹出时可能发生的 LOSS 事件,您需要暂停/静音或降低音量/躲避自己因此。
    通过这种方式,您正在编码您的应用程序是否位于前面和中心,或者是否被告知要安静和安静多长时间。这使您不必担心谁/什么/为什么/有多少其他应用程序退出以及对音频做某事,而是专注于简单地协调和响应音频管理器的指令,直到您不再关心(即应用程序退出等)。
    我发现这两个链接对于理解基础知识以及应用程序应该如何相互尊重非常有用。
    最后一个链接是 Expo AV Manager。这并不是要提供 Expo 作为解决方案,只是我觉得 Expo AV 代码运行良好,作为一个经过深思熟虑的示例,说明了在导航音频管理时可能遇到的条件组合以及哪些代码/成员变量可能对跟踪有用他们所有人中。该文件中还有很多“Expo-ey”框架内容,这些内容可能会分散注意力并被忽略,但如果你只看acquireAudioFocusonAudioFocusChange我认为那里有一些很好的灵感。
    对于一些代码和一个很好的概述

  • https://medium.com/androiddevelopers/audio-focus-3-cdc09da9c122

  • 关于生命周期背后的理念和基本原理以及如何成为一名优秀的音频公民
  • https://android-developers.googleblog.com/2013/08/respecting-audio-focus.html

  • 来自 Expo AV Manager
  • https://github.com/expo/expo/blob/master/packages/expo-av/android/src/main/java/expo/modules/av/AVManager.java

  • 最后一点,不要忘记做一个好公民,在不需要的时候放弃专注。即背景/前景,如果您的用户关闭游戏中的音乐等。

    关于java - 如何检测其他应用程序是否正在播放音乐?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67470486/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com