ios - 当另一个应用程序开始/停止播放音频时,我的应用程序可以得到通知吗?

标签 ios cocoa-touch avfoundation avaudiosession

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

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


我目前的做法:

  1. 将 Audio Session 类别设置为 AVAudioSessionCategoryAmbient 以允许将游戏音频与 iPod(或其他音乐应用程序)播放混合。
  2. applicationDidBecomeActive 中,检查 [[AVAudioSession sharedInstance] isOtherAudioPlaying] 并在后台播放其他应用时关闭游戏音乐。

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

这有几个缺陷:

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

问题:

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

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

最佳答案

在我的游戏中,ArunJTS 解决方案不起作用。第一个用户被问及麦克风。其次,它不会检测音乐状态的变化,例如,我的应用程序是否执行了某些操作并开始播放,或者用户是否已将应用程序快速切换到音乐应用程序。

我所做的是从官方获得的 app docs . 段落:“检查应用程序启动期间是否正在播放其他音频”。

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

我的解决方案:

#pragma mark - Audio

- (void) startCheckingIfOtherAppIsPlayingAudio:(BOOL)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 selector:@selector(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) applicationDidFinishLaunching:(UIApplication *)application 中,我调用了 [self startCheckingIfOtherAppIsPlayingAudio:YES]; 就这样。

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

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

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

相关文章:

ios - ViewDidLoad 在导航时只调用一次

ios - SWRevealViewController segue 只用 1 个按钮卡住

ios - Swift 将数据编码成 URL

objective-c - EXC_BAD_ACCESS问题

ios - 如何截屏 AVCameraCapturePreviewLayer

ios - 在后台启动 AVAssetExportSession

iphone - 如何更新应用程序图标和启动图像以同时支持 IOS 6 和 7?

ios - UIButton 将内容保持在 backgroundImage 之上

ios - 增强现实: camera stream on OpenGL view

iphone - 如何检查某个功能是否适用于特定的 iOS 版本?