Почему iOS не сообщает моему приложению о прерываниях аудио сеанса?

Я использую AVPlayer для воспроизведения звука из разных источников (включая музыкальную библиотеку iPod). Из-за того, что AVPlayer является более низким уровнем AVAudioPlayer, мне приходится самостоятельно обрабатывать прерывания. Использование AVAudioPlayer не вариант!

В документах Apple для разработчиков они упоминают либо слушать AVAudioSessionInterruptionNotification или настроить слушателя с AudioSessionInitialize, Но при этом я получаю уведомления только по окончании прерывания, но благодаря их документам мое приложение сможет обрабатывать и то, и другое.

Я использую следующий код для инициализации аудио сеанса: (упрощенная версия, удалены неважные строки)

AudioSessionInitialize(NULL, NULL, ARInterruptionListenerCallback, nil);
UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory);
AudioSessionSetActive(true);

А вот как выглядит слушатель:

void ARInterruptionListenerCallback(void *inUserData, UInt32 interruptionState) {
    if (interruptionState == kAudioSessionBeginInterruption) {
        // Here is the code which is never called...
    }
    else if (interruptionState == kAudioSessionEndInterruption) {
        // But this case will be executed!
    }
}

Btw. Я ожидаю, что этот код выполняется, когда происходит прерывание, например, телефонный звонок или что-то подобное. Я неправильно понимаю, что Apple объявляет прерыванием?

1 ответ

Решение

В iOS 6 есть ошибка. Кажется, что код прерывания никогда не вызывается для начального прерывания - это включает как устаревший устаревший метод (с использованием делегата AVAudioSession), так и новый метод уведомления.

Я и еще несколько человек подали в Apple запрос на серьезную ошибку, поэтому я предлагаю вам сделать то же самое ( http://bugreport.apple.com/), чтобы привлечь их внимание.

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

Изменить: увидеть эту тему

Другие вопросы по тегам