Как изменить или отключить AudioSessionInterruptionListener
Мне нужен способ изменить или отключить AudioSessionInterruptionListener после того, как AudioSession был инициализирован.
И вот почему: в некоторых случаях мое приложение должно работать в фоновом режиме с аудиозаписью, поэтому установлен режим звукового фона - это работает. Когда происходит звонок или другое прерывание, я должен сообщить некоторым другим объектам, чтобы чисто остановить запись - это работает. Затем, когда приложение сделано с AudioSession, я вызываю AudioSessionSetActive(false);
- это работает (если приложение отправляется в фоновый режим с активным сеансом, я получаю красную полосу сверху, если сеанс неактивен, красная полоса не появляется. Хотя, я думаю, технически приложение все еще находится в "активный" фоновый режим).
Тем не мение! В случае, когда я закончил с записью, и приложение было отправлено в фоновый режим, и аудио сеанс уже был деактивирован, если поступает вызов или если Siri активирован, тогда мое приложение все еще получает обратный вызов AudioSessionInterruptionListener. Да, я могу добавить код, чтобы проверить, должно ли мое приложение реагировать на прерывания. Тем не менее, я вижу это как ошибку. Если я деактивировал AudioSession, прерывания должны перестать вызываться, фактически все прослушиватели аудио сеанса / свойства должны перестать вызываться.
Как я могу изменить или отключить AudioSessionInterruptionListener? Или, может быть, другой способ спросить это, как я могу запретить моему приложению "использовать" фоновый режим, когда оно не нужно?
Дополнительная информация
Хорошо, похоже, что в iOS 6 теперь есть NSNotifications для прерываний AudioSession: AVAudioSessionDidBeginInterruptionNotification
а также AVAudioSessionDidEndInterruptionNotification
, Тем не менее, я поддерживаю iOS 5.1 и выше, так что это не поможет. И в той же документации, в которой я нашел новые уведомления, говорится, что свойство делегата для интерфейса AVAudioSession интерфейса Obj-C устарело (в IOS 6), поэтому я, вероятно, не должен использовать это для установки / изменения делегата (и получения объекта Obj). -C прерывания обратного вызова).
Я предполагаю, что возможный обходной путь - это проверить версию iOS и в <6.0 установить и сбросить делегат, а затем в 6.0+ прослушать NSNotifications (который не появится в <6.0, поэтому не должен ломаться). Тем не менее, это похоже на клудж.
1 ответ
Вы пытались вызвать AudioSessionInitialize и передать NULL AudioSessionInterruptionListener (то есть функции, которая будет обрабатывать прерывание), когда вы закончите с этим?
Интерфейс выглядит следующим образом:
OSStatus AudioSessionInitialize (
CFRunLoopRef inRunLoop,
CFStringRef inRunLoopMode,
AudioSessionInterruptionListener inInterruptionListener,
void *inClientData
);
В документации явно сказано:
Ваше приложение должно вызвать эту функцию перед выполнением любых других вызовов Audio Session Services. Вы можете активировать и деактивировать аудио сеанс по мере необходимости (см. AudioSessionSetActive), но следует инициализировать его только один раз.