2011-12-30 22 views
6

Estoy reproduciendo música con AVAudioPlayer en segundo plano. El problema es que si hay una llamada entrante interrumpe al reproductor, nunca se reanudará a menos que cambie al primer plano y lo haga manualmente.Cómo reanudar AVAudioPlayer después de la interrupción en el fondo

El código es simple, para reproducirla en el fondo:

[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayAndRecord error: nil]; 
[[AVAudioSession sharedInstance] setActive: YES error: nil]; 

url = [[NSURL alloc] initFileURLWithPath:...]; 

audio_player = [[AVAudioPlayer alloc] initWithContentsOfURL: url error:NULL]; 
audio_player.delegate = self; 
bool ret = [audio_player play]; 

delegado para manejar las interrupciones:

-(void)audioPlayerBeginInterruption:(AVAudioPlayer *)player 
{ 
    //tried this, not working [[AVAudioSession sharedInstance] setActive: NO error: nil]; 
    NSLog(@"-- interrupted --"); 
} 


//----------- THIS PART NOT WORKING WHEN RUNNING IN BACKGROUND ---------- 
- (void)audioPlayerEndInterruption:(AVAudioPlayer *)player 
{ 
    NSLog(@"resume!"); 
    //--- tried, not working: [[AVAudioSession sharedInstance] setCategory:    AVAudioSessionCategoryPlayAndRecord error: nil]; 
    //--- tried, not working: [[AVAudioSession sharedInstance] setActive: YES error: nil]; 
    //--- tried, not working: [audio_player prepareToPlay]; 
    [audio_player play]; 
} 

¿Puede cualquiera que me ayude?

+0

Mismo pb, ¿encontró una solución? – fvisticot

+1

hasta ahora, no. pero hay una solución. Las aplicaciones de apple store de ejemplo lo han hecho. – Paul

Respuesta

0

probar este

-(void)audioPlayerEndInterruption:(AVAudioPlayer *)audioPlayer withFlags:(NSUInteger)flags{ 

    if (flags == AVAudioSessionFlags_ResumePlay) { 
     [audioPlayer play]; 
    }  

espero que ayude.

+1

no funciona en segundo plano. – Paul

8

¡Encontré la solución! Tuve el mismo problema, mi aplicación estaba reanudando el audio muy bien después de una interrupción, solo si mi aplicación estaba abierta. Cuando estaba en el fondo, no se pudo reanudar la reproducción del audio después de una interrupción.

i fijo esto añadiendo las siguientes líneas de código:

añadir esta línea siempre que su aplicación iniciar la reproducción de audio. [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

Y en el método endInterruption, espere 1 o 2 segundos antes de reanudar la reproducción del audio. Esto para permitir que el sistema operativo deje de usar el canal de audio.

- (void)endInterruptionWithFlags:(NSUInteger)flags { 
    // Validate if there are flags available. 
    if (flags) { 
     // Validate if the audio session is active and immediately ready to be used. 
     if (AVAudioSessionInterruptionFlags_ShouldResume) { 
       dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1), dispatch_get_main_queue(), ^{ 
        // Resume playing the audio. 
       }); 
     } 
    } 
} 

También puede agregar esta línea cuando su aplicación se detiene (no una pausa) la reproducción de audio. Pero no es obligatorio. [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

+0

Debo cambiar esta línea if (AVAudioSessionInterruptionFlags_ShouldResume) to if (flags == AVAudioSessionInterruptionFlags_ShouldResume) – jailani

+0

Funciona bien paul muchas gracias ..... – jailani

+0

El uso del protocolo AVAudioSessionDelegate está en desuso en iOS 6 –

Cuestiones relacionadas