2009-03-20 4 views
10

Можно ли определить, есть ли у iPod Touch/iPhone какие-либо наушники или другие аксессуары, подключенные к нему?Обнаружение аксессуаров для iPhone/iPod Touch

Я создаю приложение, для которого требуется микрофон, и вам нужно знать, имеет ли «iSomething» один подключенный или нет, либо через подключение док-станции, либо через порт для наушников, например, с помощью встроенных наушников/микрофона аксессуары из Apple.

ответ

10

Наконец-то нашел его - после инициализации объекта Audio Session , - AudioSessionInitialize() - вы можете сделать вызов для AudioSessionGetProperty и получить значение kAudioSessionSprety_AudioInputAvailable.

AudioSessionInitialize(NULL, NULL, NULL, NULL);  
UInt32 propertySize, micConnected; 
    AudioSessionGetProperty(kAudioSessionProperty_AudioInputAvailable, &propertySize, &micConnected); 
    [self updateMicStatus:micConnected]; // user-created method 

Согласно документации для Audio Session Services, это должно быть использовано, а не с использованием модели устройства (iPhone против IPod Touch), чтобы определить, если аудио вход доступен для использования. Вы также можете настроить функцию обратного вызова для контроля изменений этого свойства с помощью функции AudioSessionAddPropertyListener().

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

+0

По какой-то причине это не работает для меня. На iPod Touch 2-го поколения без подключенных наушников возвращается TRUE ... – Dimitris

0

Чтобы определить, есть ли у устройства встроенный микрофон, вы можете просто пойти по адресу [UIDevice currentDevice].model, чтобы узнать, есть ли это iPhone или iPod Touch второго поколения. Что касается стороннего микрофона, подключенного к разъему док-станции, это невозможно в текущем 2.2.1 SDK, но оно может быть в более поздней версии :)

+2

Лучше протестировать поддержку функций отдельно от типа устройства. –

4

Или вы могли бы использовать:

if (![[AVAudioSession sharedInstance] inputIsAvailable]) { 
    // your code here for no audio input available 
} 
0

Вот решение, вы можете, как это, или это полезно для вас.

Перед использованием метода ниже введите две строки и

UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_None; 
    AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride); 

- (void)isHeadsetPluggedIn { 

    UInt32 routeSize = sizeof (CFStringRef); 
    CFStringRef route; 

    AudioSessionGetProperty (kAudioSessionProperty_AudioRoute, 
               &routeSize, 
               &route); 

    //NSLog(@"Error >>>>>>>>>> :%@", error); 
    /* Known values of route: 
    * "Headset" 
    * "Headphone" 
    * "Speaker" 
    * "SpeakerAndMicrophone" 
    * "HeadphonesAndMicrophone" 
    * "HeadsetInOut" 
    * "ReceiverAndMicrophone" 
    * "Lineout" 
    */ 

    NSString* routeStr = (NSString*)route; 

    NSRange headsetRange = [routeStr rangeOfString : @"Headset"]; 
    NSRange receiverRange = [routeStr rangeOfString : @"Receiver"]; 

    if(headsetRange.location != NSNotFound) { 
     // Don't change the route if the headset is plugged in. 
     NSLog(@"headphone is plugged in "); 
    } 
    else if (receiverRange.location != NSNotFound) { 
     // Change to play on the speaker 
     NSLog(@"play on the speaker"); 

    } 
    else { 
     NSLog(@"Unknown audio route."); 

    } 
} 
4

В IOS 6inputIsAvailable является устаревшим . В будущем нам необходимо использовать inputAvailable:

BOOL audioHWAvailable = audioSession.inputAvailable; 
+0

Если вам нужно протестировать аудиозапись, это логическое значение позволит вам проверить наличие аудиозаписи без остановки существующего воспроизведения звука. – russes

Смежные вопросы