Обнаружение iPhone/iPod Touch

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

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

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

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

BOOL audioHWAvailable = audioSession.inputAvailable;

Ответ 4

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

Ответ 5

Вот решение, вам может понравиться или оно вам полезно.

Прежде чем использовать метод ниже, напишите эту две строки также

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.");

    }
}