Почему 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, чтобы переключать кнопку воспроизведения / паузы и не позволять возобновлению звука после прерывания.
Изменить: увидеть эту тему