2015-08-04 6 views
15

Ich möchte wissen, wenn mein AVAudioRecorder nicht verfügbar ist (z. B. wenn Musik beginnt zu spielen).iOS AVAudioSession Unterbrechungsbenachrichtigung funktioniert nicht wie erwartet

Da audioRecorderEndInterruption mit iOS 9 veraltet sein wird, konzentriere ich mich auf die Unterbrechungsbenachrichtigung AVAudioSession (aber beide funktionieren nicht wie erwartet).

Das Problem ist, dass die Unterbrechungsbenachrichtigung nie aufgerufen wird, wenn die App im Vordergrund war und bleibt, wenn die Unterbrechung auftritt.

ZB: Der Benutzer startet und hört Musik auf, ohne die Anwendung in den Hintergrund zu stellen.

Um alle Unterbrechungen zu erfassen Ich verwende:

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

I InterruptionTypeBegan erhalten wie erwartet, aber InterruptionTypeEnded nicht, wenn die App ist noch im Vordergrund (dh es wird erst die App aufgerufen werden genannt befindet sich im Hintergrund und zurück in den Vordergrund).

Wie kann ich die Benachrichtigung InterruptionTypeEnded erhalten, wenn die Unterbrechung auftritt, während die App im Vordergrund ist?

+0

Dieser Link kann Ihnen helfen: - http://stackoverflow.com/questions/23586056/audio-interruption-when-ios-application-is-recording-in-background –

+5

Aus der Apple-Dokumentation: "Es gibt keine Garantie Bei einer beginnenden Unterbrechung kommt es zu einem Ende der Unterbrechung. Ihre App muss wissen, dass sie in den Vordergrundzustand wechseln muss oder dass der Benutzer eine Wiedergabetaste drückt. In beiden Fällen müssen Sie festlegen, ob Ihre App die Audiositzung erneut aktivieren soll. – Fennelouski

Antwort

4

Dies ist ein weit verbreitetes Problem, das sich auf alle Anwendungen auswirkt, die Framework-Komponenten verwenden (dasselbe gilt für native iOS-Apps).

Wie in 's documentation zum Thema Audio-Unterbrechungen erklärt, sollte die InterruptionTypeEnded tatsächlich in dem genannten Szenario angewandt werden:

Wenn der Benutzer die Unterbrechung ... das System ruft Ihre Callback-Methode entlässt, was darauf hinweist, dass Die Unterbrechung ist beendet.

Es kann aber auch fest, dass die InterruptionTypeEnded vielleicht gar nicht aufgerufen werden:

Es gibt keine Garantie, dass eine Unterbrechung beginnt ein Ende Unterbrechung hat.

Daher ist in dem genannten Szenario ein anderer Ansatz erforderlich.


Wenn es um den Umgang mit Musikunterbrechungen geht, wird das Problem nicht lange bestehen. iOS 9 verhindert effektiv, dass externe Audioquellen verwendet werden, während der Audio-Handler der App aufgerufen wird.

Eine Möglichkeit, das genaue Problem der Medienunterbrechung zu behandeln, könnte sein, MPMusicPlayerController 's playbackState zu hören, wie in dieser stackoverflow Frage gezeigt: Detecting if music is playing?.


Ein direkterer Weg, um das Problem der Unterbrechungen entweder wäre zu handhaben:

-Block außerhalb Audio-Unterbrechungen vollständig zum Zeitpunkt der InterruptionTypeBegan durch erneutes Aufrufen der Audio-Komponente.

Oder durch Angabe einer UI-Anzeige, dass eine externe Medienquelle die Audiositzung unterbrochen hat (z. B. ein inaktives Mikrofon).


Hoffentlich  wird mit einer besseren Lösung für das Problem kommen, aber in der Zwischenzeit diese sollten Sie einige Optionen geben die Unterbrechung Problem zu lösen.

+0

Danke @Aleksander Azizi! Btw könnten Sie mehr über "Blockieren Sie Audio-Unterbrechungen vollständig zu blockieren, indem Sie Ihre Audio-Komponente zum Zeitpunkt von InterruptionTypeBegan erneut aufrufen". ? – nahung89

+0

@ nahung89 Sobald 'InterruptionTypeBegan' aufgerufen wurde, können Sie die Audio Engine erneut initialisieren. Blockiert jede andere Audioquelle effektiv. –

+0

Ich sehe. Eigentlich habe ich es vorher versucht, aber nicht funktioniert. Telefonanruf/Alarm/Erinnerung ... haben in der Audiositzung immer höhere Priorität. Gleich nachdem wir den Audio Player neu eingerichtet haben, wird er sofort gestoppt. – nahung89

-1

Wenn Sie nicht bereits haben, versuchen Sie AVCaptureSession ‚s-Eigenschaft usesApplicationAudioSession zu NO Einstellung.

This Frage & Antwort kann als eine gute Referenz, wenn Sie nach weiteren Details suchen.

+1

Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz zur Verfügung zu stellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. – LeftyX

+0

Vielen Dank für Ihr Feedback @LeftyX Ich habe Ihre Bedenken nicht berücksichtigt und werde dies ab jetzt in meinen Antworten berücksichtigen. Ich bin etwas verwirrt darüber, warum meine Antwort abgelehnt wurde, da sie eine funktionierende Lösung enthielt. – ChrisHaze

+0

Ich habe nicht abgestimmt. Ich stimme kaum Antworten ab. Es ist immer besser, eine vollständige Erklärung in Ihrer Antwort zu geben. – LeftyX

-2

Ich versuche dies und finde InterruptionTypeEnded kann nach Musikpause in einer App aufgerufen werden, aber andere nicht bei Pause aufgerufen.

Meine Lösung ist die UI zu aktualisieren, um den Benutzer wissen zu lassen Datensatz gestoppt hat und einige damit zusammenhängende Arbeit wie Dateioperation. Wenn die Unterbrechung endet, aktiv AVAudioSession, , wenn Fehler nicht vorhanden ist, starten Sie einen neuen Datensatz.

Wenn Sie die Datei vor und nach Interrupt beitreten möchten, kann die Antwort auf diese Frage: AVAudioRecorder records only the audio after interruption hilfreich für Sie sein.

Verwandte Themen