首页 文章

AVAudioSession类别不能用作文档规定

提问于
浏览
1

我有一个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

    我想我设法解决了 - 事实证明它与我的应用程序完全无关,而是与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);
    }
    

相关问题