2012-09-12 214 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];