2015-08-04 50 views
15

Chcę wiedzieć, kiedy moja AVAudioRecorder jest niedostępna (np. Po rozpoczęciu odtwarzania muzyki).Powiadomienie o przerwaniu AVAudioSession dla iOS nie działa zgodnie z oczekiwaniami

Jako audioRecorderEndInterruption będzie nieaktualne z iOS 9 Mam skupienie na powiadomieniu o przerwaniu AVAudioSession (ale żaden nie działa zgodnie z oczekiwaniami).

Problem polega na tym, że powiadomienie o przerwaniu nigdy nie jest wywoływane, jeśli aplikacja była i pozostaje na pierwszym planie w momencie wystąpienia przerwy.

E.g: Użytkownik uruchamia i zatrzymuje odtwarzanie muzyki bez przenoszenia aplikacji w tło.

Aby wykryć żadnych przerw używam:

[[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"); 
     } 
    } 
} 

uzyskać InterruptionTypeBegan zgodnie z oczekiwaniami, ale InterruptionTypeEnded nie jest wywoływana gdy aplikacja jest nadal na pierwszym planie (co oznacza, że ​​nie będzie się do aplikacji jest umieszczony w tle i z powrotem na pierwszym planie).

Jak mogę otrzymać powiadomienie InterruptionTypeEnded, gdy przerwa wystąpi, gdy aplikacja znajduje się na pierwszym planie?

+0

Ten link może pomóc: - http://stackoverflow.com/questions/23586056/audio-interruption-when-ios-application-is-re-ording-inbackback –

+5

Z dokumentacji Apple: "Nie ma żadnej gwarancji że przerwa w rozpoczęciu będzie miała przerwę w końcowej fazie, Twoja aplikacja musi być świadoma przejścia na pierwszy plan lub naciśnięcia przycisku odtwarzania. W obu przypadkach sprawdź, czy Twoja aplikacja powinna ponownie aktywować sesję audio. " – Fennelouski

Odpowiedz

4

Jest to szeroko rozpowszechniony problem dotyczący dowolnej aplikacji korzystającej z komponentów ramowych AV (to samo dotyczy natywnych aplikacji dla systemu iOS).

Jak wyjaśniono w 's documentation na temat przerw sygnału audio, InterruptionTypeEnded powinny rzeczywiście być stosowane w scenariuszu wymienić:

Jeśli użytkownik oddala przerwanie ... system wywołuje metodę wywołania zwrotnego, wskazując, że przerwa została zakończona.

jednak również stwierdza, że ​​InterruptionTypeEnded nie można nazwać w ogóle:

Nie ma gwarancji, że będzie musiał rozpocząć przerwanie przerwanie zakończenia.

Dlatego w omawianym scenariuszu potrzebne jest inne podejście.


Jeśli chodzi o obsługę przerw w odtwarzaniu muzyki, problem nie potrwa długo. iOS 9 skutecznie zapobiega wykorzystywaniu zewnętrznych źródeł dźwięku podczas wywoływania programu obsługi audio aplikacji.

Jednym ze sposobów poradzenia sobie z dokładnym problemem przerw w dostępie do mediów może być posłuchanie MPMusicPlayerController 's playbackState, jak pokazano w tym pytaniu stackoverflow: Detecting if music is playing?.


bardziej bezpośredni sposób, aby poradzić sobie z kwestią przerw byłoby albo:

blokowe poza przerwami dźwiękowe całkowicie ponownie powołując urządzenie audio w czasie InterruptionTypeBegan.

Lub poprzez podanie wskazania interfejsu użytkownika, że ​​zewnętrzne źródło nośnika przerwała sesję audio (na przykład pokazując nieaktywny mikrofon).


Mam nadzieję  będzie wymyślić lepszego rozwiązania problemu, ale w międzyczasie to powinno dać ci kilka możliwości rozwiązania problemu przerw.

+0

Thank @Aleksander Azizi! Btw możesz wyjaśnić więcej na temat "Blokuj całkowicie przerwy w dźwięku audio, ponownie wywołując swój komponent audio w czasie InterruptionTypeBegan". ? – nahung89

+0

@ nahung89 Po wywołaniu 'InterruptionTypeBegan' możesz ponownie zainicjować silnik audio. Skutecznie blokuje każde inne źródło dźwięku. –

+0

Rozumiem. Właściwie próbowałem tego wcześniej, ale nie działałem. Połączenie telefoniczne/alarm/przypomnienie ... zawsze mają wyższy priorytet w sesji audio. Zaraz po ponownym skonfigurowaniu odtwarzacza audio zostanie on natychmiast zatrzymany. – nahung89

-1

Jeśli jeszcze tego nie zrobiłeś, spróbuj ustawić swoją AVCaptureSession 's właściwość usesApplicationAudioSession na NO.

This pytanie & odpowiedź może stanowić dobre referencje, jeśli szukasz więcej szczegółów.

+1

Podczas gdy ten link może odpowiedzieć na pytanie, lepiej umieścić tutaj istotne części odpowiedzi i podać link do odsyłacza. Odpowiedzi dotyczące linków mogą stać się nieprawidłowe, jeśli strona z linkami się zmieni. – LeftyX

+0

Dzięki za Twoją opinię @LeftyX Nie rozważałem twoich obaw i uwzględnię to od teraz w moich odpowiedziach. Jestem nieco zdezorientowany, dlaczego moja odpowiedź została odrzucona, ponieważ zawierała działające rozwiązanie. – ChrisHaze

+0

Nie głosowałem w dół. Prawie nie oddam głosu w głosowaniu. Zawsze lepiej jest podać pełne wyjaśnienie w swojej odpowiedzi. – LeftyX

-2

Próbuję tego i znajduję InterruptionTypeEnded może wywoływać po wstrzymaniu muzyki w niektórych aplikacjach, ale inne nie są wywoływane podczas pauzy.

Moje rozwiązanie polega na aktualizacji interfejsu użytkownika, aby umożliwić użytkownikowi zapoznanie się z rekordem, który został zatrzymany i wykonanie pewnych powiązanych czynności, takich jak obsługa plików. Po zakończeniu przerwy aktywny AVAudioSession, , jeśli nie ma błędu, rozpocznie nowy rekord.

Jeśli chcesz dołączyć do pliku przed i po przerwaniu, odpowiedź na to pytanie: AVAudioRecorder records only the audio after interruption może być pomocna.