2015-08-04 35 views
15

Desidero sapere quando il mio AVAudioRecorder non è accessibile (ad esempio, quando la musica inizia a suonare).Notifica di interruzione AVAudioSession iOS non funzionante come previsto

Come audioRecorderEndInterruption sarà deprecato con iOS 9 Mi sto concentrando sulla notifica di interruzione di AVAudioSession (ma nessuno dei due funziona come previsto).

Il problema è che la notifica di interruzione non viene mai chiamata se l'app era e rimane in primo piano quando si verifica l'interruzione.

E.g: l'utente avvia e interrompe la riproduzione della musica senza spostare l'applicazione in background.

per rilevare eventuali interruzioni che sto usando:

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

ottengo InterruptionTypeBegan come previsto, ma InterruptionTypeEnded non viene chiamato se l'applicazione è ancora in primo piano (il che significa che non sarà chiamato fino a quando l'applicazione è posto sullo sfondo e torna in primo piano).

Come posso ricevere la notifica InterruptionTypeEnded quando l'interruzione si verifica mentre l'app è in primo piano?

+0

Questo collegamento può aiutare: - http://stackoverflow.com/questions/23586056/audio-interruzione-quando-ios-application-is-recording-in-background –

+5

Dalla documentazione della mela: "Non c'è garanzia che l'interruzione di avvio avrà un'interruzione di fine. L'app deve essere consapevole del passaggio a uno stato di esecuzione in primo piano o all'utente che preme un pulsante di riproduzione. In entrambi i casi, determinare se l'app deve riattivare la propria sessione audio. " – Fennelouski

risposta

4

Questo è un problema molto diffuso che riguarda qualsiasi app che utilizza i componenti del framework AV (lo stesso vale per le app native iOS).

Come spiegato nel 's documentation in materia di interruzioni audio, il InterruptionTypeEnded dovrebbe essere effettivamente applicate nello scenario menzionato:

Se l'utente chiude l'interruzione ... il sistema richiama il metodo di callback, che indica che l'interruzione è finita.

Tuttavia, si afferma anche che il InterruptionTypeEnded potrebbe non essere chiamato a tutti:

Non v'è alcuna garanzia che un'interruzione di iniziare avrà un'interruzione finale.

Pertanto, nello scenario menzionato è necessario un approccio diverso.


Quando si tratta di gestire interruzioni musicali, il problema non sarà intorno a lungo. iOS 9 impedisce efficacemente l'uso di fonti audio esterne mentre viene richiamato il gestore audio dell'app.

Un modo per gestire l'esatto problema dell'interruzione dei media potrebbe essere quello di ascoltare MPMusicPlayerController di playbackState, come mostrato in questa domanda StackOverflow: Detecting if music is playing?.


un modo più diretto per gestire il problema delle interruzioni sarebbe quello di uno:

blocco fuori interruzioni audio completamente ri-invocando il componente audio al momento della InterruptionTypeBegan.

Oppure dando un'indicazione dell'interfaccia utente che una sorgente multimediale esterna ha interrotto la sessione audio (ad esempio mostrando un microfono inattivo).


Speriamo  si presenti con una soluzione migliore al problema, ma nel frattempo questo dovrebbe darvi alcune opzioni per risolvere il problema di interruzione.

+0

Grazie a @Aleksander Azizi! Per saperne di più su "Blocca completamente le interruzioni audio invocando nuovamente il tuo componente audio al momento di InterruptionTypeBegan". ? – nahung89

+0

@ nahung89 Una volta chiamato 'InterruptionTypeBegan' è possibile inizializzare di nuovo il motore audio. Bloccare in modo affettuoso qualsiasi altra fonte audio. –

+0

Vedo. In realtà l'ho provato prima, ma non ha funzionato. Telefonata/allarme/promemoria ... hanno sempre una priorità più alta nella sessione audio. Subito dopo aver impostato di nuovo il lettore audio, verrà immediatamente interrotto. – nahung89

-1

Se non lo hai già fatto, prova a impostare la proprietà AVCaptureSessionusesApplicationAudioSession a NO.

This domanda & risposta può fungere da buon riferimento se stai cercando ulteriori dettagli.

+1

Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il link per riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. – LeftyX

+0

Grazie per il tuo feedback @LeftyX Non avevo considerato le tue preoccupazioni e lo prenderò in considerazione da ora in poi nelle mie risposte. Sono un po 'confuso sul motivo per cui la mia risposta non è stata votata, dato che includeva una soluzione di lavoro. – ChrisHaze

+0

Non ho votato. Ho appena votato le risposte negative. È sempre meglio dare una spiegazione completa nella risposta. – LeftyX

-2

Ho provato questo e trovare InterruptionTypeEnded può essere chiamato dopo la pausa della musica in alcune app, ma altre chiamate non in pausa.

La mia soluzione è aggiornare l'interfaccia utente per consentire all'utente di sapere che il record si è interrotto e svolgere alcune operazioni correlate, come l'operazione sui file. Al termine dell'interruzione, AVAudioSession attivo, se non ha l'errore, avvia un nuovo record.

Se si desidera unire il file prima e dopo l'interruzione, la risposta a questa domanda: AVAudioRecorder records only the audio after interruption potrebbe essere utile.