2015-08-04 4 views
15

Я хочу знать, когда мой AVAudioRecorder недоступен (например, когда музыка начинает воспроизводиться).Уведомление о прерывании IOS AVAudioSession не работает должным образом

Как audioRecorderEndInterruption будет устаревшим с iOS 9 Я сосредотачиваюсь на уведомлении об отключении AVAudioSession (но не работает должным образом).

Проблема в том, что уведомление о прерывании никогда не вызывается, если приложение было и остается на переднем плане, когда происходит прерывание.

E.g: Пользователь запускает и останавливает воспроизведение музыки, не перемещая приложение в фоновом режиме.

Для обнаружения каких-либо перерывов я использую:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioSessionWasInterrupted:) name:AVAudioSessionInterruptionNotification object:nil]; 
... 
- (void)audioSessionWasInterrupted:(NSNotification *)notification { 
    if ([notification.name isEqualToString:AVAudioSessionInterruptionNotification]) { 
     NSLog(@"Interruption notification"); 

     if ([[notification.userInfo valueForKey:AVAudioSessionInterruptionTypeKey] isEqualToNumber:[NSNumber numberWithInt:AVAudioSessionInterruptionTypeBegan]]) { 
      NSLog(@"InterruptionTypeBegan"); 
     } else { 
      NSLog(@"InterruptionTypeEnded"); 
     } 
    } 
} 

я InterruptionTypeBegan, как и ожидалось, но InterruptionTypeEnded не вызывается, если приложение все еще находится на переднем плане (то есть он не будет называться, пока приложение помещается в фоновом режиме и обратно на передний план).

Как я могу получить уведомление InterruptionTypeEnded, когда прерывание происходит, когда приложение находится на переднем плане?

+0

Эта ссылка может вам помочь: - http://stackoverflow.com/questions/23586056/audio-interruption-when-ios-application-is-recording-in-background –

+5

Из документации на яблоко: «Нет гарантии что начало прерывания будет иметь прерывание. Ваше приложение должно быть в курсе перехода в состояние запуска переднего плана или пользователя, нажимая кнопку воспроизведения. В любом случае определите, должно ли ваше приложение повторно активировать аудио сессию ». – Fennelouski

ответ

4

Это распространенная проблема, затрагивающая любое приложение с использованием компонентов инфраструктуры AV (то же самое относится к родным приложениям iOS).

Как объяснено в 's documentation по теме аудио перерывами InterruptionTypeEnded на самом деле должен быть применен в случае упомянутого:

Если пользователь закрывает прерывание ... система вызывает ваш метод обратного вызова, что указывает на прерывание закончилось.

Однако, он также утверждает, что InterruptionTypeEnded не может называться вообще:

Там нет никакой гарантии, что начать прерывание будет иметь конечное прерывание.

Поэтому в упомянутом сценарии необходим другой подход.


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

Способ обработки точной проблемы прерывания работы носителя может состоять в том, чтобы прослушать MPMusicPlayerControllerplaybackState, как показано в этом вопросе stackoverflow: Detecting if music is playing?.


Более прямой способ справиться вопрос прерывания будет либо:

Блок внешних прерывания звука полностью повторно вызова аудиокомпонента во время InterruptionTypeBegan.

Или указав пользовательский интерфейс, что внешний медиа-источник прервал сеанс аудио (например, показав неактивный микрофон).


Надеюсь  придумает лучшее решение проблемы, но в то же время это должно дать вам несколько вариантов для решения проблемы прерывания.

+0

Спасибо @Александр Азизи! Btw вы могли бы объяснить больше о «Блокировать внешние прерывания звука полностью путем повторного вызова вашего аудиокомпонента во время InterruptTypeBegan». ? – nahung89

+0

@ nahung89 После вызова 'InterruptionTypeBegan' вы можете снова инициализировать звуковой движок. Эффективно блокирует любой другой источник звука. –

+0

Я вижу. На самом деле я пробовал это раньше, но не работал. Телефонный звонок/будильник/напоминание ... всегда имеют более высокий приоритет в сеансе аудио. Сразу после того, как мы снова настроим аудиоплеер, он будет немедленно остановлен. – nahung89

-1

Если вы еще этого не сделали, попробуйте установить AVCaptureSession свойства usesApplicationAudioSession на NO.

This Вопрос & Ответ может служить хорошей ссылкой, если вы ищете более подробную информацию.

+1

Хотя эта ссылка может ответить на вопрос, лучше включить здесь основные части ответа и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. – LeftyX

+0

Спасибо за ваши отзывы @LeftyX Я не думал о ваших проблемах и буду принимать это во внимание с этого момента в моих ответах. Я несколько смущен тем, почему мой ответ был проголосован, хотя, поскольку он включает в себя рабочее решение. – ChrisHaze

+0

Я не проголосовал. Я почти не отвечаю на вопросы. Всегда лучше дать полное объяснение в вашем ответе. – LeftyX

-2

Я пробовал это и обнаружил, что InterruptionTypeEnded может вызывать после паузы в музыке в каком-то приложении, но другие не вызываются при паузе.

Мое решение обновляет пользовательский интерфейс, чтобы остановить запись информации о пользователях и выполнить некоторые связанные работы, такие как работа с файлами. Когда прерывание заканчивается, активная AVAudioSession, , если не имеет ошибки, начните новую запись.

Если вы хотите присоединиться к файлу до и после прерывания, ответ на этот вопрос: AVAudioRecorder records only the audio after interruption может быть вам полезен.