当另一个应用程序启动/停止播放音频时,我的应用程

时间:2013-11-21 05:42:54

标签: ios cocoa-touch avfoundation avaudiosession

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

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


我目前的做法:

  1. 将音频会话类别设置为AVAudioSessionCategoryAmbient,以允许将游戏音频与iPod(或其他音乐应用)播放混合。
  2. applicationDidBecomeActive中,检查[[AVAudioSession sharedInstance] isOtherAudioPlaying],如果其他应用在后台播放,请关闭游戏的音乐。
  3. 这在大多数情况下似乎都有效。当游戏启动时,它会中断背景音乐应用程序的播放。如果您想播放自己的音乐,则必须故意返回并在第三方音乐应用中按播放,或使用iOS 7的向上滑动控制面板。否则,游戏自己的音乐将接管。

    这有几个缺陷:

    1. 当iPhone / iPod耳塞内置的点击按钮遥控器启动/停止第三方音乐应用的播放时,它无法检测到
    2. 虽然它适用于iPod应用程序,但它不适用于SoundCloud应用程序。我没有测试过任何其他人。

    3. 问题:

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

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

2 个答案:

答案 0 :(得分:1)

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

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

我只是定期检查另一个应用程序播放的内容并做出适当的反应。

我的解决方案:

#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];,这就是全部。

所有这些都存在于app delegate实现文件中。

所以这将是我对你问题的回答。我没有发现有关weater音乐应用程序或其他应用程序开始做某事的任何通知。我已经阅读了整个音频会话编程指南,看了AVPlayer,AVAudioSession类引用,发现没有这样的事情。如果有人知道更好,更智能的解决方案,请告诉我。

答案 1 :(得分:0)

我在iOS应用程序中遇到了类似的问题,并通过'Bamsworld的解决方案解决了这个问题。 查看link以获取详细信息。

解决方案:

在你的applicationDelegates方法 - (BOOL)应用程序中尝试这个:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

// set audio session category AVAudioSessionCategoryPlayAndRecord with no options
success = [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayAndRecord error:nil];
if (!success) {
    NSLog(@"setCategoryError");
}

// set audio session mode to default
success = [[AVAudioSession sharedInstance] setMode:AVAudioSessionModeDefault error:nil];
if (!success) {
    NSLog(@"setModeError");
}

// activate audio session
success = [[AVAudioSession sharedInstance] setActive:YES error:nil];
if (!success) {
    NSLog(@"activationError");
}