Вопрос

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

BOOL audioHWAvailable = audioSession.inputAvailable;

Чтобы определить, есть ли в устройстве встроенный микрофон, вы можете просто пройти мимо [UIDevice currentDevice].model чтобы узнать, iPhone это или iPod Touch 2-го поколения.Что касается микрофона стороннего производителя, подключенного к разъему док-станции, это невозможно в текущем пакете 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.");

    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top