2009-03-20 18 views
10

¿Es posible detectar si el iPod Touch/iPhone tiene auriculares u otros accesorios conectados?Detección de accesorios para iPhone/iPod Touch

Estoy construyendo una aplicación que requiere un micrófono, y necesito saber si el "iSomething" tiene uno conectado o no, ya sea a través de la conexión de base o usando el puerto de auriculares, como con el auricular/micrófono en línea accesorio de Apple.

Respuesta

10

Finalmente lo encontré - Después de inicializar el objeto Audio Session , - AudioSessionInitialize(): puede realizar 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 Audio sesión de servicios, 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 en esta propiedad a través de AudioSessionAddPropertyListener().

No estoy seguro todavía si esta propiedad también se aplica a dispositivos conectados a través del conector Dock, pero parece que funciona para la toma de auriculares.

+0

Por alguna razón, esto no funciona para mí. En un iPod Touch 2nd generation sin auriculares conectados, devuelve TRUE ... – Dimitris

0

Para determinar si el dispositivo tiene un micrófono incorporado, puede ir por [UIDevice currentDevice].model para ver si es un iPhone o un iPod Touch de 2da generación. En cuanto a un micrófono de un tercero enchufado en el conector Dock, esto no es posible en el 2.2.1 SDK actual, pero puede estar en una versión posterior :)

+2

Es mejor para la prueba de soporte de las funciones separadas de tipo de dispositivo. –

4

O usted podría utilizar:

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

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

    } 
} 
4

En IOS 6inputIsAvailable se obsoleta. En el futuro tenemos que utilizar inputAvailable:

BOOL audioHWAvailable = audioSession.inputAvailable; 
+0

Si necesita probar la grabación de audio, este valor booleano le permitirá verificar la disponibilidad de la grabación de audio sin detener la reproducción de audio existente. – russes