2013-11-21 2 views
2

В моей игре iOS есть музыка и звуковые эффекты. Я хотел бы позволить пользователям слушать свою музыку вместо фоновой музыки игры.Может ли мое приложение быть уведомленным, когда другое приложение запускает/останавливает воспроизведение аудио?

Простым решением является добавление нового пункта меню, который отключает фоновую музыку игры. Тем не менее, я бы хотел избежать создания нового элемента меню, если не могу убедиться, что этот подход для пользователя еще хуже.


Мой текущий подход:

  1. Установите аудио категорию сеанса AVAudioSessionCategoryAmbient, чтобы смешивать игры аудио с IPod (или другой музыки приложение) воспроизведения.
  2. В applicationDidBecomeActive, проверьте [[AVAudioSession sharedInstance] isOtherAudioPlaying] и выключите музыку, если в фоновом режиме воспроизводится другое приложение.

Это похоже на работу в большинстве случаев. Когда игра запускается, она прерывает воспроизведение фонового музыкального приложения. Если вы хотите играть свою собственную музыку, вам необходимо сознательно вернуться и нажать кнопку воспроизведения в стороннем музыкальном приложении или использовать панель управления iOS 7. В противном случае собственная музыка игры возьмет верх.

Это приходит с парой недостатков:

  1. Он не обнаруживает при воспроизведении музыкального приложения стороннего является старт/стоп с помощью щелчка кнопки пульта дистанционного управления, встроенного в iPhone/IPod наушники.
  2. Хотя он работает с iPod, он не работает с приложением SoundCloud. Я не тестировал других.

Вопрос:

Есть ли способ, чтобы получать уведомления, когда сторонние музыкальные приложения (например, АРР, Айпод) начать воспроизведение/стоп? В качестве альтернативы, есть ли способ получить уведомление при изменении значения @property BOOL otherAudioPlaying?

Может ли такой подход получить обратный эффект? Неразумно ли просто использовать пункт меню?

ответ

0

У меня была аналогичная проблема в моем приложении iOS, и она была решена с помощью решения «Bamsworld». Для получения более подробной информации свяжитесь с link.

Решение:

Попробуйте это в вас метод applicationDelegates - (BOOL) Применение: (UIApplication *) 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"); 
} 
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]; и это все.

Все это находится в файле реализации делегата приложения.

Так что это был бы мой ответ на ваш вопрос. Я не узнал никаких уведомлений о приложении Music Art или какое-то другое приложение, которое начало что-то делать. Я прочитал руководство по программированию аудио сессий и просмотрел ссылки на AVPlayer, AVAudioSession и не нашел такой вещи. Если кто-нибудь знает лучшее и более разумное решение, пожалуйста, дайте мне знать.

+0

Вид не яблоко, нет ли для этого делегата или уведомлений? – s1ddok