Я пробовал использовать эти методы в попытке определить, активен ли переключатель «Звонок / Без звука»:
Как программно определить переключатель отключения звука iPhone?
AVAudioSession категория не работает, как того требует документация
Но на моем iPhone 4 значением «состояния» всегда является «Динамик» (а значение длины, возвращаемое CFStringGetLength (состояние), всегда равно 7). Кто-нибудь успешно пользовался этим методом? Если да, то на каком устройстве и какой версии SDK?
Я называю это так:
- (BOOL)deviceIsSilenced {
CFStringRef state;
UInt32 propertySize = sizeof(CFStringRef);
OSStatus audioStatus = AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &propertySize, &state);
if (audioStatus == kAudioSessionNoError) {
NSLog(@"audio route: %@", state) // "Speaker" regardless of silent switch setting, but "Headphone" when my headphones are plugged in
return (CFStringGetLength(state) <= 0);
}
return NO;
}
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
audioSession.delegate = self;
[audioSession setCategory:AVAudioSessionCategoryAmbient error:nil];
[audioSession setActive:YES error:nil];
NSLog(@"muted? %i", [self deviceIsSilenced]);
...
}
Я подумал, может быть, какое-то другое (более точное) событие kAudioSessionProperty запускается, когда физический переключатель на телефоне ... переключился. У кого-нибудь есть идеи?
Кстати, я использую категорию AVAudioSessionCategoryAmbient с моим [AVAudioSession sharedInstance].
Обновление: Я также пробовал использовать разные категории аудио и несколько других аудио свойства сеанса, ни один из них не срабатывает при отключении / включении переключателя. : (
Обновление от 1 января 2014 г.: Это немного похоже на взлом, и я обнаружил сбой при работе с ним в многозадачном режиме на моем iPhone 5S, но библиотека SoundSwitch связана в новый принятый ответ - это то, что нужно, если вы хотите обнаружить тихий переключатель. Он работает даже в iOS 7.