Подтвердить что ты не робот

Как обнаружить iphone в бесшумном режиме

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

Если кто-то знает, что это любезно ответит.

4b9b3361

Ответ 1

Причина, по которой код 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

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

UInt32 routeSize = sizeof (CFStringRef);
CFStringRef route;

AudioSessionGetProperty (
                         kAudioSessionProperty_AudioRoute,
                         &routeSize,
                         &route
                        );

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

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

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

AudioSessionAddPropertyListener (
                                 kAudioSessionProperty_AudioRouteChange,
                                 audioRouteChangeListenerCallback,
                                 self
                                 );

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

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

Ответ 3

Для полноты создания этой ссылки от 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 или какой-то другой класс...

Ответ 4

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

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

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