3

Audio Session Cookbook中有一节关于“在应用启动期间检查其他音频是否正在播放”。

我正在使用 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 音乐继续播放 - 即使我的应用程序在后台运行时正在播放我自己的音乐(并使用硬件解码器)。

(而且,反过来——如果我的应用程序在后台没有播放音乐,我想检测它返回时是否可以开始播放音乐)。

我怎样才能做到这一点?(最好不要突然切断我的音频,保持通常发生的良好淡出。)

编辑:我还应该指出,我所有的音频工作都是在主线程之外完成的。

4

2 回答 2

0

关于您对 refulgentis 答案的最后评论,您可以在 applicationWillResignActive 中暂停音乐,并为 applicationDidEnterBackground 保留状态保存操作和清理。这可能更好地避免在后台转换状态期间出现任何奇怪的行为。

于 2010-10-31T16:22:03.870 回答
0

为什么不在你的应用程序委托多任务消息中实现它呢?在后台,暂停您的音频(必要时存储当前播放位置),并在应用程序恢复焦点时将其重新启动。

只是为了澄清一点:通过重置您的音频播放器状态来响应您的委托中的 applicationDidEnterBackground:,并通过按照您现在的方式设置它来响应 applicationWillEnterForeground:。您还可以让设置音频播放的对象通过 NSNotificationCenter 响应 UIApplicationWillEnterBackgroundNotification/UIApplicationWillEnterForegroundNotification,这可能会更容易一些,但代价是从您的应用程序委托类中抽象出您的应用程序在后台执行的操作。

于 2010-10-25T00:35:14.240 回答