2016-05-09 29 views
0

Ich möchte ein Lied über den Lautsprecher wiedergeben, während ich mit Quickblox einen Videoanruf empfangen kann.Wie kann ich verhindern, dass Avaudiosession deaktiviert wird?

Meine Audio-Raten werden durcheinander gebracht. Und auch ein größeres Problem ist, wenn der Aufruf beendet QuickBlox Framework setzt Audio-Session in den deaktivierten Zustand. d. h. [Avaudiosession sharedInstance] setActive: NO ....

Wie verhindere ich das?

Oder gibt es eine Möglichkeit, das oben genannte Szenario zu behandeln.

Ich habe google für einen Monat jetzt gelesen und noch keine passenden Antworten oder irgendwelche Richtlinien gefunden. Kann mir jemand bei diesem Problem helfen/??

Antwort

1

Erstens erlaubt AVAudioSession mit anderen AVAudioSessions zu arbeiten, werden Sie die Option AVAudioSessionCategoryOptionMixWithOthers einrichten müssen, wenn es zu initialisieren:

NSError *sessionError = NULL; 
    BOOL success = [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback 
                withOptions:AVAudioSessionCategoryOptionMixWithOthers 
                  error:&sessionError]; 

    if(!success) { 
     NSLog(@"Error setting category Audio Session: %@", [sessionError localizedDescription]); 
    } 

Unterbrechungen zu behandeln (ein Anruf, Alarm, etc ..),

[[NSNotificationCenter defaultCenter] addObserver:self 
               selector:@selector(handleAudioSessionInterruption:) 
                name:AVAudioSessionInterruptionNotification 
                object:[AVAudioSession sharedInstance]]; 

die NSNotification wird carr: Sie sollten einen Beobachter für Unterbrechungen der NSNotificationCenter, wo Sie in der Lage zu handhaben, die Aktivierung/Deaktivierung des AVAudioSession bei Bedarf einrichten y die Art der Unterbrechung und Schlüssel:

- (void)handleAudioSessionInterruption:(NSNotification*)notification { 

    NSNumber *interruptionType = [[notification userInfo] objectForKey:AVAudioSessionInterruptionTypeKey]; 
    NSNumber *interruptionOption = [[notification userInfo] objectForKey:AVAudioSessionInterruptionOptionKey]; 

    switch (interruptionType.unsignedIntegerValue) { 
     case AVAudioSessionInterruptionTypeBegan:{ 
      // • Audio has stopped, already inactive 
      // • Change state of UI, etc., to reflect non-playing state 
      NSLog(@"AVAudioSessionInterruptionTypeBegan"); 

     } break; 
     case AVAudioSessionInterruptionTypeEnded:{ 
      // • Make session active 
      // • Update user interface 
      // • AVAudioSessionInterruptionOptionShouldResume option 
      NSLog(@"AVAudioSessionInterruptionTypeEnded"); 
      if (interruptionOption.unsignedIntegerValue == AVAudioSessionInterruptionOptionShouldResume) { 
       // Here you should continue playback. 
      } 
     } break; 
     default: 
      break; 
    } 
} 
+0

Große Antwort! Aber leider hat das Problem nicht gelöst. Ich überprüfte die Protokolle Ich erhalte diesen Fehler: AVAudioSession.mm:692: - [AVAudioSession setActive: withOptions: error:]: Deaktiviert eine Audiositzung mit laufenden E/A. Vor dem Deaktivieren der Audiositzung sollten alle E/A angehalten oder angehalten werden. auch: AVAudioSession.mm:692: - [AVAudioSession setActive: withOptions: error:]: Deaktiviert eine Audiositzung mit laufenden E/A. Vor dem Deaktivieren der Audiositzung sollten alle E/A angehalten oder angehalten werden. – saurabh2810

+0

@ sabrabh2810 Das obige Beispiel behandelt Interrupts aus anderen Anwendungen. Sie erhalten den laufenden I/O-Fehler, weil ein anderer Teil der SAME-Anwendung den AV verwendet. Überprüfen Sie Ihre Klassen oder wenn Ihre Plugins hybrid sind. –