2011-12-30 19 views
6

私はバックグラウンドでAVAudioPlayerを使用して音楽を再生しています。問題は、着信コールがプレーヤを中断した場合、フォアグラウンドに切り替えて手動で行うまで再開しないことです。いずれかが私を助けることができるバックグラウンドで中断した後にAVAudioPlayerを再開する方法

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

:割り込みを処理するため

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

デリゲートを:

コードは、バックグラウンドでそれを再生するために、簡単ですか?

+0

同じpbですが、解決策を見つけましたか?これまでのところ、 – fvisticot

+1

はありません。しかし、解決策があります。サンプルのリンゴストアアプリはこれを行っています。 – Paul

答えて

0

この

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

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

を試してみて、それがお役に立てば幸いです。

+1

はバックグラウンドで動作しません。 – Paul

8

解決策を見つけました! 同じ問題がありましたが、私のアプリが開いていた場合に限り、中断後にオーディオをうまく再開していました。それがバックグラウンドにあったとき、中断後にオーディオを再生するのに失敗しました。

私は、次のコード行を追加することで、これを固定:あなたのアプリがオーディオの再生を開始するたびに

は、この行を追加します。 [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

endInterruptionメソッドでは、オーディオの再生を再開するまで1〜2秒待ってください。 OSがオーディオチャンネルの使用を停止できるようにする。

- (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)からif(flags == AVAudioSessionInterruptionFlags_ShouldResume)に変更する必要があります – jailani

+0

うまく働いていますか? – jailani

+0

AVAudioSessionDelegateプロトコルの使用は、iOS 6では廃止予定です –

関連する問題