AVAudioSessionDelegate вызывается при endInterruption, но не вызывается beginInterruption
Я настраиваю AVAudioSession при запуске приложения и устанавливаю делегата в appDelegate. Кажется, все работает (воспроизведение и т. Д.), За исключением того, что beginInterrupt для делегата не вызывается, когда телефон получает вызов. Когда вызов заканчивается, вызывается endInterruption.
Единственная мысль, которая у меня возникла, заключается в том, что используемый мной код аудиопроигрывателя раньше основывался на AVAudioPlayer, но теперь использует AVPlayer. Обратные вызовы для делегата AVAudioPlayer для обработки прерываний все еще существуют, но кажется странным, что они конфликтуют любым способом.
5 ответов
Если посмотреть на заголовок, в iOS6 выглядит, что AVAudioSessionDelegate теперь устарела.
использование AVAudioSessionInterruptionNotification
вместо этого в iOS6.
Обновление: это не сработало. Я думаю, что есть ошибка в рамках.
Да, по моему опыту, beginInterruption или недавно задокументированная AVAudioSessionInterruptionNotification работают должным образом. Мне нужно было отследить статус игрока, используя локальный флаг, а затем обработать endInterruption:withFlags:
метод для отслеживания восстановления после прерываний.
В iOS 6 восстановление после прерывания по крайней мере удержит ваш AudioPlayer в нужном месте, поэтому мне не нужно было хранить последнее известное время воспроизведения моего AVAudioPlayer, мне просто нужно было нажать кнопку play.
Вот решение, которое я придумал. Похоже, что iOS 6 убивает ваше аудио с помощью Media Reset, если AVPlayer остается резидентным слишком долго. В конечном итоге происходит воспроизведение AVPlayer, но звук не выходит. Скорость на AVPlayer равна 1, но нет абсолютно никакого звука. Чтобы добавить боли в ситуацию, нет ошибки ни в AVAudioSession setActive, ни в самом AVPlayer, который указывает на наличие проблемы.
Добавьте к тому, что вы не можете зависеть от appWillResignActive, потому что ваше приложение уже может быть в фоновом режиме, если вы вообще зависите от жестов дистанционного управления.
Окончательное решение, которое я реализовал, заключалось в добавлении периодического наблюдателя на AVPlayer и записи последнего известного времени. Когда я получаю событие, которое мне было возвращено, я создаю новый AVPlayer, загружаю его с AVPlayerItem и требуемое время seekToTime.
Это довольно досадный обходной путь, но, по крайней мере, он работает и позволяет избежать периодических сбоев.
Я могу подтвердить, что используя C api, метод прерывания также не вызывается, когда начинается прерывание; только когда это заканчивается
(AudioSessionInitialize (nil, nil, interruptionListenerCallback, (__bridge void *)(self));
Я также подал отчет об ошибке с яблоком для этой проблемы.
Изменить: это исправлено в iOS 6.1 (но не iOS 6.0.1)
Просто позвони:
[[AVAudioSession sharedInstance] setDelegate: self];
Я только что проверил на своем iPhone 5 (под управлением iOS 6.0), установив точку останова в функции обратного вызова AudioSessionInterruptionListener, которая была объявлена в AudioSessionInitialize(), и этот обратный вызов прерывания, фактически, вызывается, когда у приложения есть активный аудио сеанс и аудио и прерывается входящим телефонным звонком (Xcode показывает, что приложение остановилось на точке останова в начале прерывания, с которого я затем продолжаю).
У меня есть приложение, затем остановите аудиоустройство и отключите аудио сеанс. Затем, по окончании обратного вызова прерывания, приложение повторно активирует аудио сеанс и перезапускает аудиоустройство без проблем (приложение записывает звук должным образом впоследствии).
Я построил совершенно новый поток аудио (AVPlayer
) приложение поверх iOS 6.0.x и обнаружил такую же проблему.
Делегаты теперь устарели, и мы должны использовать уведомления, это здорово, но вот мои выводы:
- Во время входящего звонка я получаю только
AVAudioSessionInterruptionTypeEnded
в моем обработчике, наряду сAVAudioSessionInterruptionOptionShouldResume
, Аудио сеанс приостанавливается автоматически (аудио исчезает), и мне просто нужно возобновить воспроизведениеAVPlayer
, - Однако при попытке запустить игру, такую как CSR Racing, я получаю странное впечатление
AVAudioSessionInterruptionTypeBegan
но никаких признаков того, что мое приложение может возобновить воспроизведение, даже не убивая игру.
Теперь это может зависеть от других факторов, таких как моя категория аудио (в моем случае AVAudioSessionCategoryPlayback
) и настройки микширования обоих приложений (kAudioSessionProperty_OverrideCategoryMixWithOthers
Я не уверен, но определенно вижу что-то неуместное.
Надеюсь, другие сообщили, что на 6.1beta это исправлено, и мне еще нужно обновить, так что посмотрим.