2011-12-30 65 views
6

我在後臺使用AVAudioPlayer播放音樂。問題是:如果有傳入的呼叫中斷播放器,它將永遠不會恢復,除非切換到前景並手動執行。如何在後臺中斷後恢復AVAudioPlayer

代碼很簡單,在後臺播放:

[[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]; 

委託來處理中斷:

-(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]; 
} 

任何一個能幫助我嗎?

+0

同一個pb,你找到了解決方案嗎? – fvisticot 2011-12-31 17:26:34

+1

到目前爲止,沒有。但有一個解決方案。示例蘋果商店應用程序已經做到了。 – Paul 2012-01-09 22:13:04

回答

0

試試這個

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

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

希望它能幫助。

+1

不能在後臺工作。 – Paul 2012-01-09 19:28:11

8

找到解決方案! 我遇到了同樣的問題,我的應用在中斷後恢復音頻很好,只有當我的應用打開時。當它在背景上時,失敗後恢復播放音頻。

加入這一行,只要你的應用程序開始播放音頻:

我通過添加以下代碼行固定這一點。 [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

並在endInterruption方法中,等待1或2秒後再繼續播放音頻。這樣可以讓操作系統停止使用音頻通道。

- (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. 
       }); 
     } 
    } 
} 

您還可以在應用程序停止播放音頻(不暫停)時添加此行。但不是必需的。 [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

+0

如果(AVAudioSessionInterruptionFlags_ShouldResume)如果(AVAudioSessionInterruptionFlags_ShouldResume)更改爲if(flags == AVAudioSessionInterruptionFlags_ShouldResume) – jailani 2014-03-13 13:42:49

+0

工作良好保羅非常感謝您..... – jailani 2014-03-13 13:48:39

+0

AVAudioSessionDelegate協議的使用在iOS 6中不推薦使用 – 2014-10-14 23:21:49

相關問題