AVAudioSession类别不能用作文档规定

时间:2011-04-06 01:31:30

标签: iphone ios avaudiosession

我有一个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调用,但我得到了相同的结果 - 环境会话类别根本不想尊重静音开关,尽管如此文档说应该这样做。

有什么想法吗?谢谢你的帮助:)

1 个答案:

答案 0 :(得分: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);
}