iOS 9检测静默模式

时间:2016-03-15 10:03:13

标签: ios avaudiosession avaudioengine

我一直在寻找很长一段时间,在放弃之前作为最后一次尝试发布。 我想检测我当前是否处于静音模式。

我找到了一种解决方法(播放假声并检查完成情况),但只有当我不在AVAudioSessionCategoryPlayAndRecord模式时才能正常工作。 这正是在我可以录制我想要实现的音频和视频的屏幕上,以便知道我是否应该播放UI声音。

总而言之,我试图找到一种在AVAudioSessionCategoryPlayAndRecord模式下检测静音模式的方法。

1 个答案:

答案 0 :(得分:1)

这是一个尝试通过将音频会话类别短暂切换到SoloAmbient(一个尊重静音开关的类别) - 读取开关 - 然后切换回来来读取开关的解决方案。这对你来说可能是最好的方法。

如果交换音频会话类别会干扰您的应用程序,我建议可能在播放音频之前进行检查并使用您检测到的值然后对静音开关进行开/关作出反应。这是一个解决方法,但它应该给你一些信息。

切换到环境类别,确定静音开关是否打开,然后将会话切换回我需要的音频设置。在确定开关是否打开后,您需要确定所需的音频会话类别并交换到该类别。

-(BOOL)muteSwitchEnabled {

    #if TARGET_IPHONE_SIMULATOR
    // set to NO in simulator. Code causes crashes for some reason.
    return NO;
    #endif

    // switch to Ambient to detect the switch
    AVAudioSession* sharedSession = [AVAudioSession sharedInstance];
    [sharedSession setCategory:AVAudioSessionCategoryAmbient error:nil];

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

    BOOL muteSwitch = (CFStringGetLength(state) <= 0);
    NSLog(@"Mute switch: %d",muteSwitch);

    // code below here is just restoring my own audio state, YMMV
    _hasMicrophone = [sharedSession inputIsAvailable];
    NSError* setCategoryError = nil;

    if (_hasMicrophone) {

        [sharedSession setCategory: AVAudioSessionCategoryPlayAndRecord error: &setCategoryError];

        // By default PlayAndRecord plays out over the internal speaker.  We want the external speakers, thanks.
        UInt32 ASRoute = kAudioSessionOverrideAudioRoute_Speaker;
        AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,
        sizeof (ASRoute),m&ASRoute);
    } else {
        // Devices with no mic don't support PlayAndRecord - we don't get playback, so use just playback as we don't have a microphone anyway
        [sharedSession setCategory: AVAudioSessionCategoryPlayback error: &setCategoryError];

        if (setCategoryError) {
            NSLog(@"Error setting audio category! %@", setCategoryError);
        }
        return muteSwitch;
    }
}