代码之家  ›  专栏  ›  技术社区  ›  Andrew Russell

在iOS中,我如何处理多任务的其他音频播放?

  •  2
  • Andrew Russell  · 技术社区  · 15 年前

    Audio Session Cookbook 有一节是关于 Checking if Other Audio is Playing During App Launch ".

    我使用的是MonoTouch(但请随意给出一个Objective-C答案,API是相同的),因此该文档中的代码如下所示:

    bool otherAudioPlaying = AudioSession.OtherAudioIsPlaying;
    if(otherAudioPlaying)
        AudioSession.Category = AudioSessionCategory.AmbientSound;
    else
        AudioSession.Category = AudioSessionCategory.SoloAmbientSound;
    

    结果是,如果我的应用程序启动时播放iPod音乐,iPod音乐将继续播放,并阻止我使用硬件音频解码器(反正我不需要)。如果我的应用程序启动时没有iPod音乐播放,我可以使用硬件解码器。

    然后我可以使用 otherAudioPlaying 决定是否开始播放我自己的音乐。

    现在,在不支持多任务处理的较旧操作系统上,这一切都很好。但通过多任务处理,用户可以离开我的应用程序(将其背景化),开始在iPod上播放音乐,然后重新进入我的应用程序。然后他们的iPod音乐将被静音,我的音乐将再次开始播放。

    我想要的是,当我的应用程序返回前台时,iPod音乐仍能继续播放——即使我的应用程序在后台播放我自己的音乐(并使用硬件解码器)。

    (反过来,如果我的应用程序是在没有播放音乐的情况下启动的,我想检测一下,当它返回时,我是否可以开始播放音乐)。

    我该怎么做?(最好不要突然切断我的音频,保持通常发生的良好淡出效果。)

    编辑:我还应该指出,我做的所有音频工作都脱离了主线。

    2 回复  |  直到 15 年前
        1
  •  0
  •   refulgentis    15 年前

    为什么不在你的应用程序中实现它呢?在后台,暂停音频(必要时存储当前播放位置),并在应用程序恢复聚焦时将其重新旋转。

    再澄清一点:通过重置音频播放器状态来响应代理中的ApplicationIdentinterBackground:和通过将其设置为现在的方式来响应applicationWillEnterForeground:。您还可以让设置音频播放的对象通过NSNotificationCenter响应UIApplicationWillEnterBackgroundNotification/UIApplicationWillEnterForeggroundNotification,这可能会更容易一些,但代价是将应用程序在后台执行的操作从应用程序委派类中抽象出来。

        2
  •  0
  •   Nick Toumpelis    15 年前

    关于您最后对refulgentis答案的评论,您可以在ApplicationWillResignative中暂停音乐,并将状态保存操作和清理留给ApplicationIdentinterBackground。这可能会更好地避免背景过渡状态期间的任何奇怪行为。