OStack程序员社区-中国程序员成长平台

标题: ios - 当另一个应用程序开始/停止播放音频时可以通知我的应用程序吗? [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-12 16:38
标题: ios - 当另一个应用程序开始/停止播放音频时可以通知我的应用程序吗?

我的 iOS 游戏有音乐和音效。我想让用户听他们自己的音乐来代替游戏的背景音乐。

一个简单的解决方案是添加一个禁用游戏背景音乐的新菜单项。但是,我想避免创建新的菜单项,除非我确信这种方法对用户来说更糟。


我目前的做法:

  1. 将 Audio Session 类别设置为 AVAudioSessionCategoryAmbient 以允许将游戏音频与 iPod(或其他音乐应用)播放混合。
  2. applicationDidBecomeActive 中,勾选 [[AVAudioSession sharedInstance] isOtherAudioPlaying],如果后台正在播放其他应用,则关闭游戏音乐。

这似乎在大多数情况下都有效。当游戏启动时,它会中断背景音乐应用程序的播放。如果你想播放自己的音乐,那么你必须特意返回并在第三方音乐应用程序中按下播放,或者使用 iOS 7 的向上滑动控制面板。否则,游戏自己的音乐将接管。

这有几个缺陷:

  1. 它不会检测第三方音乐应用程序的播放何时由 iPhone/iPod 耳塞内置的点击按钮 Remote 开始/停止。
  2. 虽然它适用于 iPod 应用程序,但它不适用于 SoundCloud 应用程序。我没有测试过任何其他人。

问题:

有没有办法在第三方音乐应用(例如 iPod 应用)开始/停止播放时接收通知?或者,有没有办法在 @property BOOL otherAudioPlaying 的值发生变化时得到通知?

这种方法会适得其反吗?不简单地使用菜单项是愚蠢的吗?



Best Answer-推荐答案


在我的游戏中,ArunJTS 解决方案不起作用。第一个用户被问及麦克风。其次,它没有检测到音乐状态变化,例如,我的应用程序做了什么并开始播放,或者用户快速应用程序切换到音乐应用程序。

我的所作所为来源于官方app docs . 段落:“在应用启动期间检查其他音频是否正在播放”。

我只是定期检查是否有其他应用在播放某些内容并做出适当的 react 。

我的解决方案:

#pragma mark - Audio

- (void) startCheckingIfOtherAppIsPlayingAudioBOOL)shouldStart
{
    if (shouldStart == YES)
    {
        if (self.timerMusicCheck.isValid)
        {
            return;
        }

        //[self.timerMusicCheck fire];
    }
    else
    {
        [self.timerMusicCheck invalidate];
        self.timerMusicCheck = nil;
    }
}

- (NSTimer*) timerMusicCheck
{
    if (_timerMusicCheck)
    {
        return _timerMusicCheck;
    }

    _timerMusicCheck = [NSTimer timerWithTimeInterval:30 target:self selectorselector(checkIsOtherAudioPlaying) userInfo:nil repeats:YES];
    [[NSRunLoop currentRunLoop] addTimer:_timerMusicCheck forMode:NSDefaultRunLoopMode];

    return _timerMusicCheck;
}

- (void) checkIsOtherAudioPlaying
{
    AVAudioSession *audioSession = [AVAudioSession sharedInstance];
    if (!audioSession.otherAudioPlaying)
    {
        K_LOG("game audio resume");
        KMiscTools::resumeBackgroundMusic();
    }
    else
    {
        K_LOG("game audio suspend");
        KMiscTools::suspendBackgroundMusic();
    }
}

- (void) applicationDidFinishLaunchingUIApplication *)application 我调用 [self startCheckingIfOtherAppIsPlayingAudio:YES]; 就是这样。

所有这些都驻留在应用委托(delegate)实现文件中。

所以这就是我对你问题的回答。我没有发现任何关于weater Music 应用程序或其他应用程序开始做某事的通知。我已经阅读了整个 Audio Session 编程指南并查看了 AVPlayer、AVAudioSession 类引用,但没有发现这样的东西。如果有人知道更好更智能的解决方案,请告诉我。

关于ios - 当另一个应用程序开始/停止播放音频时可以通知我的应用程序吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20113377/






欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) Powered by Discuz! X3.4