Я попытался использовать эти методы в попытке обнаружить, что переключатель Ring/Silent активен или нет:
Как программно определить переключатель отключения звука iPhone?
Категория AVAudioSession не работает в соответствии с документацией
Но на моем iPhone 4 значение "state" всегда "Speaker" (и значение длины, возвращаемое 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.