Как обнаружить iphone в беззвучном режиме - PullRequest
17 голосов
/ 07 мая 2009

Я занимаюсь разработкой приложения. В том, что я хочу определить через кодирование, что «iPhone в беззвучном режиме или нет?». Я разрабатываю его, используя какао с Objective-C.

Если кто-нибудь знает, пожалуйста, ответьте.

Ответы [ 4 ]

19 голосов
/ 15 февраля 2011

Причина, по которой код 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;
4 голосов
/ 07 мая 2009

Это возможно, протестировав аудио-маршрут 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
                                 );

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

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

3 голосов
/ 15 января 2011

Для полноты, используя эту ссылку от Дана Бона, я применяю следующий метод для решения этой проблемы в своих приложениях. Следует отметить, что сначала код проверяет симулятор 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 или какой-либо другой такой класс ...

1 голос
/ 13 сентября 2011

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

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

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

...