如何在 iOS 中暂停后台播放器

Posted

技术标签:

【中文标题】如何在 iOS 中暂停后台播放器【英文标题】:How to pause background player in iOS 【发布时间】:2014-01-08 10:47:32 【问题描述】:

我有这种情况:

在后台,默认的 iPhone 音频播放器(或任何其他音频播放器)正在播放一些音乐。 在前台我的应用程序正在运行。然后,在某些情况下,我的应用程序必须播放音频文件(有点像 GPS 导航器)。 我希望我的应用程序暂停后台播放器(闪避是不够的),播放其文件,然后继续播放后台播放器。 这可能吗?

谢谢你, donescamillo@gmail.com

【问题讨论】:

Resume Background Audio After Playing Sound With AVAudioPlayer的可能重复 【参考方案1】:

ios 6 开始,您可以使用 AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation flag 选项将音频会话设置为活动、播放文件然后停用会话。确保在需要播放音频时设置一个不可混合的类别,以便背景音频停止。

简单的步骤-

    // Configure audio session category and activate ready to output some audio
    [[AVAudioSession sharedInstance] setActive:YES error:nil];
    // Play some audio, then when completed deactivate the session and notify other sessions
    [[AVAudioSession sharedInstance] setActive:NO withOptions: AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:nil];

来自 Apple 的文档-

在 setActive:withOptions:error: 实例方法的 flags 参数中传入时,表示当您的音频会话停用时,其他已被您的会话中断的音频会话可以返回其活动状态。 此标志仅在停用您的音频会话时使用;即当你在setActive:withOptions:error:实例方法的beActive参数中传入NO值时

还有-

如果任何关联的音频对象(例如队列、转换器、播放器或录音机)当前正在运行,则停用会话将失败。

编辑:更详细的示例 -

在应用程序生命周期开始时配置可混合的音频会话

    // deactivate session
    BOOL success = [[AVAudioSession sharedInstance] setActive:NO error: nil];
    if (!success)  NSLog(@"deactivationError"); 
    // set audio session category AVAudioSessionCategoryPlayAndRecord
    success = [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionMixWithOthers error:nil];
    if (!success)  NSLog(@"setCategoryError"); 
    // set audio session mode to default
    success = [[AVAudioSession sharedInstance] setMode:AVAudioSessionModeDefault error:nil];
    if (!success)  NSLog(@"setModeError"); 
    // activate audio session
    success = [[AVAudioSession sharedInstance] setActive:YES error: nil];
    if (!success)  NSLog(@"activationError"); 

当您的应用程序想要输出音频而不播放任何背景音频时,首先像这样更改音频会话类别

    // activate a non-mixable session
    // set audio session category AVAudioSessionCategoryPlayAndRecord
    BOOL success;
    AVAudioSessionCategoryOptions AVAudioSessionCategoryOptionsNone = 0;
    success = [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionsNone error:nil];
    if (!success)  NSLog(@"setCategoryError"); 

    // set audio session mode default
    success = [[AVAudioSession sharedInstance] setMode:AVAudioSessionModeDefault error:nil];
    if (!success)  NSLog(@"setModeError"); 

    // activate audio session
    success = [[AVAudioSession sharedInstance] setActive:YES error: nil];
    if (!success)  NSLog(@"activationError"); 

    // commence playing audio here...

当您的应用程序完成播放音频后,您可以停用音频会话

    // deactivate session and notify other sessions
    // check and make sure all playing of audio is stopped before deactivating session...
    BOOL success = [[AVAudioSession sharedInstance] setActive:NO withOptions: AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error: nil];
    if (!success)  NSLog(@"deactivationError"); 

我可以确认上面的代码可以运行,但在运行 iOS 7.0.4iPhone 5 上播放 Music App 进行了测试这不能保证,因为还有其他考虑因素,例如用户操作。例如,如果我插入耳机,来自音乐应用程序的背景音频会路由到耳机并继续播放,但如果我移除耳机,音乐应用程序产生的背景音频会暂停。

更多信息请阅读 AVAudioSession 类参考

【讨论】:

但是当我激活我的会话并开始播放(如你所建议的那样)时,背景音频会停止吗?我希望它停止,而不仅仅是减少音量 是的,它确实会暂停音频(不闪避),并从同一位置恢复,但我只用音乐应用程序进行了测试。查看我的编辑。

以上是关于如何在 iOS 中暂停后台播放器的主要内容,如果未能解决你的问题,请参考以下文章

如何分配 AVPlayer 播放/暂停按钮 iOS?

我们如何在ios的前台处理耳机播放/暂停按钮事件

UIWebView:当应用程序进入后台时,iOS 6 中的 HTML5 音频暂停

【iOS】后台播报TTS(防止APP后台被杀死)

在 iOS 中播放声音会暂停背景音乐

IOS 音频实现以及后台播放音频