sonido solo hablo escucha entrada detecta desactivado cuando como auriculares audifonos audifono arreglar altavoz iphone ipad ios

iphone - solo - Detecta si los auriculares(no el micrófono) están enchufados a un dispositivo iOS



mi iphone solo se escucha en altavoz (4)

Esta pregunta ya tiene una respuesta aquí:

Necesito cambiar mi audio dependiendo de si los auriculares están enchufados o no. Conozco kAudioSessionProperty_AudioInputAvailable, que me dirá si hay un micrófono, pero me gustaría probar los auriculares, no solo los auriculares con un built-in. en el micrófono es posible?


Aquí hay una solución basada en el comentario de Rob Mayoff:

- (BOOL)isHeadsetPluggedIn { AVAudioSessionRouteDescription *route = [[AVAudioSession sharedInstance] currentRoute]; BOOL headphonesLocated = NO; for( AVAudioSessionPortDescription *portDescription in route.outputs ) { headphonesLocated |= ( [portDescription.portType isEqualToString:AVAudioSessionPortHeadphones] ); } return headphonesLocated; }

Simplemente enlace al marco de AVFoundation.


Aquí hay un método mío que es una versión ligeramente modificada de uno encontrado en este sitio: http://www.iphonedevsdk.com/forum/iphone-sdk-development/9982-play-record-same-time.html

- (BOOL)isHeadsetPluggedIn { UInt32 routeSize = sizeof (CFStringRef); CFStringRef route; OSStatus error = AudioSessionGetProperty (kAudioSessionProperty_AudioRoute, &routeSize, &route); /* Known values of route: * "Headset" * "Headphone" * "Speaker" * "SpeakerAndMicrophone" * "HeadphonesAndMicrophone" * "HeadsetInOut" * "ReceiverAndMicrophone" * "Lineout" */ if (!error && (route != NULL)) { NSString* routeStr = (NSString*)route; NSRange headphoneRange = [routeStr rangeOfString : @"Head"]; if (headphoneRange.location != NSNotFound) return YES; } return NO; }


Comencé con el código dado arriba por jpsetung, pero hubo algunos problemas con mi caso de uso:

  • No hay evidencia de algo llamado kAudioSessionProperty_AudioRoute en los documentos
  • route fugas
  • Sin sesión de audio
  • Comprobación de cuerdas para auriculares en lugar de conciencia lógica de las categorías
  • Estaba más interesado en si el iPhone estaba usando sus parlantes, con "auriculares" que significa "cualquier cosa que no sean parlantes". Siento que omitir opciones como "bluetooth", "airplay" o "lineout" era peligroso.

Esta implementación amplía la verificación para permitir cualquier tipo de salida especificada:

BOOL isAudioRouteAvailable(CFStringRef routeType) { /* As of iOS 5: kAudioSessionOutputRoute_LineOut; kAudioSessionOutputRoute_Headphones; kAudioSessionOutputRoute_BluetoothHFP; kAudioSessionOutputRoute_BluetoothA2DP; kAudioSessionOutputRoute_BuiltInReceiver; kAudioSessionOutputRoute_BuiltInSpeaker; kAudioSessionOutputRoute_USBAudio; kAudioSessionOutputRoute_HDMI; kAudioSessionOutputRoute_AirPlay; */ //Prep BOOL foundRoute = NO; CFDictionaryRef description = NULL; //Session static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ AudioSessionInitialize(NULL, NULL, NULL, NULL); }); //Property UInt32 propertySize; AudioSessionGetPropertySize(kAudioSessionProperty_AudioRouteDescription, &propertySize); OSStatus error = AudioSessionGetProperty(kAudioSessionProperty_AudioRouteDescription, &propertySize, &description); if ( !error && description ) { CFArrayRef outputs = CFDictionaryGetValue(description, kAudioSession_AudioRouteKey_Outputs); CFIndex count = CFArrayGetCount(outputs); if ( outputs && count ) { for (CFIndex i = 0; i < count; i++) { CFDictionaryRef route = CFArrayGetValueAtIndex(outputs, i); CFStringRef type = CFDictionaryGetValue(route, kAudioSession_AudioRouteKey_Type); NSLog(@"Got audio route %@", type); //Audio route type if ( CFStringCompare(type, routeType, 0) == kCFCompareEqualTo ) { foundRoute = YES; break; } } } } else if ( error ) { NSLog(@"Audio route error %ld", error); } //Cleanup if ( description ) { CFRelease(description); } //Done return foundRoute; }

Usado así:

if ( isAudioRouteAvailable(kAudioSessionOutputRoute_BuiltInSpeaker) ) { //Do great things... }


Solo un aviso para los futuros lectores de esta publicación.

La mayoría de los métodos de AVToolbox han quedado en desuso con el lanzamiento de iOS 7 sin alternativa, por lo que los oyentes de audio ahora son en gran medida redundantes