2009-05-07 3 views

ответ

4

Это возможно путем тестирования на NULL аудио маршрута с использованием AudioToolbox:

UInt32 routeSize = sizeof (CFStringRef); 
CFStringRef route; 

AudioSessionGetProperty (
         kAudioSessionProperty_AudioRoute, 
         &routeSize, 
         &route 
         ); 

if (route == NULL) { 
    NSLog(@"Silent switch is on"); 
} 

Если маршрут NULL, то нет никаких доступных аудио выходов. Если это «Гарнитура» или «Наушники», то переключатель бесшумного звонка все еще может быть включен. Однако он никогда не будет включен, когда он настроен на «Динамик».

Вы, вероятно, лучше испытывать для этого в вашем аудио слушателя изменить маршрут собственности, который установлен ниже:

AudioSessionAddPropertyListener (
           kAudioSessionProperty_AudioRouteChange, 
           audioRouteChangeListenerCallback, 
           self 
           ); 

Примечания: Если вы делаете что-нибудь в стиле фанк, как первостепенные аудио маршруты, то этот ответ может не применять.

Настройка и отключение аудио сессии в целом, вероятно, выходит за рамки этого ответа.

+0

Большое спасибо coob. Я проверю его и дам вам знать. – Jyotsna

+0

Это работало нормально для вас? –

+0

@Jyotsna - этот код работал для вас? – sathis

3

Для полноты, строительства this link от Dan Bon, я реализую следующий метод решения этой проблемы в своих приложениях. Следует отметить, что код сначала проверяет симулятор iPhone - выполнение кода ниже приведет к сбою симулятора. Кто-нибудь знает, почему?

-(BOOL)silenced { 
    #if TARGET_IPHONE_SIMULATOR 
     // return NO in simulator. Code causes crashes for some reason. 
    return NO; 
    #endif 

    CFStringRef state; 
    UInt32 propertySize = sizeof(CFStringRef); 
    AudioSessionInitialize(NULL, NULL, NULL, NULL); 
    AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &propertySize, &state); 
    if(CFStringGetLength(state) > 0) 
     return NO; 
    else 
     return YES; 

} 

Заявляя это право в контроллере представления, вы бы просто проверить

if ([self silenced]) { 
    NSLog(@"silenced"); 

else { 
    NSLog(@"not silenced"); 
} 

Или, очевидно, вы могли бы объявить его в какой-то вспомогательный класс. Более элегантным решением может быть добавление категории на UIApplication или какой-либо другой класс ...

+0

устарел в ios 7 –

+0

AudioSessionGetProperty теперь устарел. Существует [AVAudioSession sharedInstance] .currentRoute, чтобы получить currentRoute, но даже использование AVAudioSessionCategoryAmbient не позволяет получить состояние переключения аппаратного обеспечения. – slamor

+0

Не работает. каждый раз, когда он идет в другом месте ... –

19

Причина, по которой код Pirripli не работает, заключается в том, что симулятор не поддерживает тест, а код не проверяет наличие ошибок. Исправленный код будет выглядеть следующим образом:

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

if (status == kAudioSessionNoError) 
{ 
    return (CFStringGetLength(state) == 0); // YES = silent 
} 
return NO; 
+2

не работает на iPhone 4 iOS 5 :(.. state = "speaker", я думаю – Mazyod

+0

Правильно, не работает на iOS 5, выясняется, что Apple никогда не предназначалась это приложение будет использоваться таким образом. Мое приложение больше не пытается узнать состояние переключателя без звука. Приложение выводит звук, и если пользователь отключает звук, звук не звучит. Приложение также предпочитает вибрацию и если пользователь включил его, приложение вибрирует в дополнение к звуку. Таким образом, пользователь имеет полный контроль, и приложение не должно знать статус коммутатора. – Neil

+0

@Ниль, вы говорите, что ваше приложение «больше не пытается чтобы узнать состояние переключателя отключения звука », но затем« если пользователь выключил звук, звук не звучит ». Не означает ли это, что вы контролируете переключатель отключения звука? Какая категория (или категории) вы используете? –

1

Вы можете использовать аудио свойства маршрута, как было предложено в предыдущих ответах, но имейте в виду, что: - Он работает только если Audio Категория является AmbientSound - Вы не должны инициализировать аудио Сессия более одного раза в приложении (см. Руководство по программированию аудиозаписей) - Вы должны освободить эти CFStringRef, чтобы избежать утечек памяти.

В случае, если текущая категория аудио не является AmbientSound, вы можете подумать об изменении ее временно, выполнить проверьте свойство Audio Route, а затем восстановите исходную категорию аудио.

Обратите внимание, что изменение категории аудио приведет к восстановлению Audio Route по умолчанию для этой категории с учетом текущей конфигурации оборудования (то есть подключены ли наушники или нет).