Обнаружение iPhone/iPod Touch Аксессуары

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

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

5 ответов

Решение

Наконец нашел его - После инициализации объекта 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

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

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

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

BOOL audioHWAvailable = audioSession.inputAvailable;

Или вы можете использовать:

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

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

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

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

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

    }
}
Другие вопросы по тегам