2010-08-26 10 views
8

¿Alguien sabe si puede detectar si los auriculares están enchufados en el iPhone, y si no son así? Deshabilite el sonido de su aplicación.Detectando si los auriculares están enchufados en el iPhone

Creo que podría gestionar la desactivación del sonido, pero la parte de detección aún no he encontrado nada.

Gracias

+0

Por favor, visite este enlace, donde ya he respondido .. http://stackoverflow.com/questions/667196/detecting-iphone-ipod-touch-accessories/7575623#7575623 –

Respuesta

4

http://developer.apple.com/iphone/library/samplecode/SpeakHere/Introduction/Intro.html

En este proyecto hay un código de fragmento donde se detiene la grabación si los auriculares es unpluged. Tal vez puedas usarlo para lograr tu resultado.

¡Buena suerte!

(editar)

Usted tendrá que estudiar el archivo SpeakHereController.mm.
me encontré con este código en el método awakeFromNib

// we do not want to allow recording if input is not available 
error = AudioSessionGetProperty(kAudioSessionProperty_AudioInputAvailable, &size, &inputAvailable); 
if (error) printf("ERROR GETTING INPUT AVAILABILITY! %d\n", error); 
btn_record.enabled = (inputAvailable) ? YES : NO; 

// we also need to listen to see if input availability changes 
error = AudioSessionAddPropertyListener(kAudioSessionProperty_AudioInputAvailable, propListener, self); 
if (error) printf("ERROR ADDING AUDIO SESSION PROP LISTENER! %d\n", error); 
+0

Gracias, voy a tener un vistazo a eso! :) –

4

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

Antes de utilizar por debajo de método, escribir esta 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."); 
     } 
} 
+3

Actualización reciente de iOS 5 obsoleta 'kAudioSessionProperty_AudioRoute', use 'kAudioSessionProperty_AudioRouteDescription' en su lugar – petershine

+0

Este código me ha causado un error, creo que debido a que AudioSessionGetPropertySize tuvo que ser llamado inexplicablemente primero. Ver mi respuesta trabajando en iOS6 a continuación (o con suerte arriba si se actualiza) ;-) –

+0

¡AudioSessionGetProperty ahora está en desuso! –

6

Con este código se puede detectar los cambios entre:

  • MicrophoneWired
  • auriculares
  • LineOut
  • altavoz

Detecting when an iOS Device connector was plugged/unplugged

Nota: Puesto que el IOS 5 parte de la "audioRouteChangeListenerCallback (...)" comportamiento está en desuso pero se puede actualizar con:

// kAudioSession_AudioRouteChangeKey_PreviousRouteDescription -> Previous route 
// kAudioSession_AudioRouteChangeKey_CurrentRouteDescription -> Current route 

CFDictionaryRef newRouteRef = CFDictionaryGetValue(routeChangeDictionary, kAudioSession_AudioRouteChangeKey_CurrentRouteDescription); 
NSDictionary *newRouteDict = (NSDictionary *)newRouteRef; 

// RouteDetailedDescription_Outputs -> Output 
// RouteDetailedDescription_Outputs -> Input 

NSArray * paths = [[newRouteDict objectForKey: @"RouteDetailedDescription_Outputs"] count] ? [newRouteDict objectForKey: @"RouteDetailedDescription_Outputs"] : [newRouteDict objectForKey: @"RouteDetailedDescription_Inputs"]; 

NSString * newRouteString = [[paths objectAtIndex: 0] objectForKey: @"RouteDetailedDescription_PortType"]; 

// newRouteString -> MicrophoneWired, Speaker, LineOut, Headphone 

Saludos

3

para realizar una verificación única para determinar si los auriculares están enchufados (en lugar de configurar una devolución de llamada cuando están desenchufados) Encontré los siguientes trabajos en iOS5 y superior:

- (BOOL) isAudioJackPlugged 
{ 

// initialise the audio session - this should only be done once - so move this line to your AppDelegate 
AudioSessionInitialize(NULL, NULL, NULL, NULL); 
UInt32 routeSize; 

// oddly, without calling this method caused an error. 
AudioSessionGetPropertySize(kAudioSessionProperty_AudioRouteDescription, &routeSize); 
CFDictionaryRef desc; // this is the dictionary to contain descriptions 

// make the call to get the audio description and populate the desc dictionary 
AudioSessionGetProperty (kAudioSessionProperty_AudioRouteDescription, &routeSize, &desc); 

// the dictionary contains 2 keys, for input and output. Get output array 
CFArrayRef outputs = CFDictionaryGetValue(desc, kAudioSession_AudioRouteKey_Outputs); 

// the output array contains 1 element - a dictionary 
CFDictionaryRef dict = CFArrayGetValueAtIndex(outputs, 0); 

// get the output description from the dictionary 
CFStringRef output = CFDictionaryGetValue(dict, kAudioSession_AudioRouteKey_Type); 

/** 
These are the possible output types: 
kAudioSessionOutputRoute_LineOut 
kAudioSessionOutputRoute_Headphones 
kAudioSessionOutputRoute_BluetoothHFP 
kAudioSessionOutputRoute_BluetoothA2DP 
kAudioSessionOutputRoute_BuiltInReceiver 
kAudioSessionOutputRoute_BuiltInSpeaker 
kAudioSessionOutputRoute_USBAudio 
kAudioSessionOutputRoute_HDMI 
kAudioSessionOutputRoute_AirPlay 
*/ 

return CFStringCompare(output, kAudioSessionOutputRoute_Headphones, 0) == kCFCompareEqualTo; 
} 

Para aquellos que mantienen la puntuación en el hogar, eso es una cadena en un diccionario en una matriz en un diccionario.

+2

obsoleto en iOS7 – jomafer

Cuestiones relacionadas