Pregunta

¿Es posible detectar si el iPod Touch / iPhone tiene cualquier tipo de auriculares u otros accesorios conectados a él?

Estoy construyendo una aplicación que requiere un micrófono, y necesitan saber si el "iSomething" ha uno conectado o no, ya sea a través de la conexión de muelle, o utilizando el puerto de auriculares, por ejemplo, con los auriculares en línea accesorio / micrófono de Apple.

¿Fue útil?

Solución

Finalmente se encontró - Después de inicializar el objeto de sesión de audio, - AudioSessionInitialize () -. Podrá hacer una llamada a AudioSessionGetProperty, y obtener el valor de kAudioSessionProperty_AudioInputAvailable

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

De acuerdo con la documentación para servicios de sesión de audio, esto se debe utilizar en lugar de utilizar el modelo de dispositivo (iPhone vs iPod Touch) para determinar si una entrada de audio está disponible para su uso. También puede configurar una función de devolución de llamada para controlar los cambios a esta propiedad a través de AudioSessionAddPropertyListener ().

No es seguro todavía si esta propiedad también se aplica a los dispositivos conectados a través del conector de base, pero parece funcionar para la toma de auriculares.

Otros consejos

O usted podría utilizar:

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

En IOS 6 inputIsAvailable es desuso . En el futuro tenemos que utilizar inputAvailable:

BOOL audioHWAvailable = audioSession.inputAvailable;

Para determinar si el dispositivo tiene un micrófono incorporado que sólo puede ir por [UIDevice currentDevice].model para ver si se trata de un iPhone o un iPod Touch segunda generación. Por lo que un micrófono de terceros enchufado en el conector de la base, esto no es posible en el actual 2.2.1 SDK, pero puede ser en una versión posterior:)

Aquí está la solución, es posible que gusta o que es útil para usted.

Antes de utilizar por debajo de este método, escribir dos líneas también

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

    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top