これは、オーディオ セッション カテゴリを 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;
}
}