2012-09-12 276 views
1

我想爲iPhone編寫應用程序,播放音頻提示序列,並以良好的方式與其他應用程序產生的聲音進行通信。在後臺播放聲音提示序列暫停播放音樂並且不會被其他聲音停止

爲了更具體我想達到以下幾點:
1.每隔10秒播放聲音提醒。 (這是爲了簡化問題,在我的應用程序中有一個時間序列,它指定何時播放提醒)
2.聲音應該在後臺工作。
3.如果播放音樂應該暫停,我的應用程序應該產生音頻提醒,然後音樂恢復。
4.如果其他應用程序開始使用聲音,我的提醒順序應繼續工作(例如,在我的應用程序運行後音樂開始或來電)。

通過下面的代碼,我能夠實現第1點和第2點。但我無法實現如何在同一時間實現3.和4.。

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    audioSession = [AVAudioSession sharedInstance]; 
} 

// Following function is used to start reproducing sounds and also called 
// for the next sounds 
- (IBAction)soundPlayShort:(id)sender 
{ 
    NSURL * url = @"reminder sound url here"; 

    // soundPlayer is defined in .h file as AVAudioPlayer 
    if (soundPlayer == nil) { 
     // initialize soundPlayer 
     soundPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil]; 
     soundPlayer.delegate = self; 
    } 
    [soundPlayer playAtTime:soundPlayer.deviceCurrentTime + 10]; 
    [audioSession setCategory:AVAudioSessionCategoryPlayback error:nil];  
} 

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag 
{ 
    [self soundPlayShort:self]; 
} 

如果我更新audioPlayerDidFinishPlaying如下面的代碼,其他的聲音恢復(第3點),但在我的序列中的下提醒不叫的話(與第2點)

- (void)restoreOtherSounds 
{ 
    [audioSession setActive:NO 
     withFlags:AVAudioSessionSetActiveFlags_NotifyOthersOnDeactivation error:nil]; 
} 

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag 
{ 

    [self restoreOtherSounds]; 
    [self soundPlayShort:self]; 
} 

我還沒有意識到如何恢復提醒順序,例如來電後。 (點4)

即使部分答案可能對我很有幫助。提前致謝。

回答

0

點2相關,嘗試設置音頻對話活躍在soundPlayShort初始化AVAudioPlayer前:

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