2

私は長い間探していましたが、あきらめる前の最後の試みとしてここに投稿しました。現在サイレント モードになっているかどうかを検出したい。

正常に動作する回避策 (偽のサウンドを再生して完了を確認する) を見つけましたが、AVAudioSessionCategoryPlayAndRecordモードにない場合のみです。これはまさに、UI サウンドを再生する必要があるかどうかを知るために、これを実現したいオーディオとビデオを記録できる画面上にあります。

要約すると、モードがオンのときにサイレントモードを検出する方法を見つけようとしていAVAudioSessionCategoryPlayAndRecordます。

4

1 に答える 1

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;
    }
}
于 2016-08-13T06:00:37.350 に答える