2

我有一个 iOS 应用程序在某些地方有一些音频反馈,但我希望允许用户在后台播放的任何其他音乐在此播放。此外,我希望我的应用程序中的音频尊重静音开关。根据开发人员文档,此功能应全部由 AVAudioSession 环境类别启用。这是我正在使用的代码:

if (!hasInitialisedAudioSession) {
    AVAudioSession *session = [AVAudioSession sharedInstance];
    [session setCategory:AVAudioSessionCategoryAmbient error:NULL];

    [session setActive:YES error:NULL];

    hasInitialisedAudioSession = YES;
}

代码执行得很好,它确实让应用程序的声音通过 iPod 音乐播放。然而,它没有做的是尊重静音开关。我尝试将这段代码换成类似的 C 音频调用(诸如 AudioSessionSetProperty 之类的东西)而不是 Objective-C 调用,但我得到了相同的结果 - 环境会话类别根本不想尊重静音开关,尽管文档说它应该这样做。

有任何想法吗?谢谢您的帮助 :)

4

1 回答 1

0

我想我设法解决了 - 事实证明它与我的应用程序无关,而是与 iPod 应用程序有关。当 iPod 不播放时,我的应用程序遵循静音开关,然后允许 iPod 在它上面播放——我想要的所有行为。但是,当 iPod 播放时,应用程序停止响应静音开关,所以我认为这只是 iPod 对设备音频设置所做的事情。如果我真的想花时间在它上面,我可能会想办法解决它,但只要它在 iPod 不播放时服从静音开关,这对我来说就足够了。

编辑:要解决这个问题,只需使用此功能来确定是否手动打开静音开关,如果结果为“是”则不要播放声音。但是,如果您没有中央音频管理器课程,可能会有点痛苦。如果 Apple 可以在他们的文档中发布这种行为,那就太好了。

- (BOOL)deviceIsSilenced
{
    #if TARGET_IPHONE_SIMULATOR
    // return NO in simulator. Code causes crashes for some reason.
    return NO;
    #endif

    CFStringRef state;
    UInt32 propertySize = sizeof(CFStringRef);
    AudioSessionInitialize(NULL, NULL, NULL, NULL);
    AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &propertySize, &state);

    return (CFStringGetLength(state) <= 0);
}
于 2011-04-07T01:03:23.240 回答