son solo reconoce los escucha entrada earpods detecta con compatibles como auriculares audifonos audifono arreglar airpods ios ios7 avaudioplayer avaudiosession headphones

ios - solo - los audifonos del iphone 7 son compatibles con el iphone 5s



¿Están enchufados los auriculares? ios 7 (7)

Swift 3:

Para verificar si los auriculares están conectados

extension AVAudioSession { static var isHeadphonesConnected: Bool { return sharedInstance().isHeadphonesConnected } var isHeadphonesConnected: Bool { return !currentRoute.outputs.filter { $0.isHeadphones }.isEmpty } } extension AVAudioSessionPortDescription { var isHeadphones: Bool { return portType == AVAudioSessionPortHeadphones } }

Luego puede print("isHeadphones connected: /(AVAudioSession.isHeadphonesConnected)")

Escuchando los cambios

En Swift 3 la sintaxis es esta:

func handleRouteChange(_ notification: Notification) { guard let userInfo = notification.userInfo, let reasonRaw = userInfo[AVAudioSessionRouteChangeReasonKey] as? NSNumber, let reason = AVAudioSessionRouteChangeReason(rawValue: reasonRaw.uintValue) else { fatalError("Strange... could not get routeChange") } switch reason { case .oldDeviceUnavailable: print("oldDeviceUnavailable") case .newDeviceAvailable: print("newDeviceAvailable") if AVAudioSession.isHeadphonesConnected { print("Just connected headphones") } case .routeConfigurationChange: print("routeConfigurationChange") case .categoryChange: print("categoryChange") default: print("not handling reason") } } func listenForNotifications() { NotificationCenter.default.addObserver(self, selector: #selector(handleRouteChange(_:)), name: NSNotification.Name.AVAudioSessionRouteChange, object: nil) }

Observe el uso de:

if AVAudioSession.isHeadphonesConnected { print("Just connected headphones") }

Desarrollar una aplicación para un iPhone con archivos de audio que necesitan ser escuchados también a través de auriculares.

¿Cómo puedo verificar si los auriculares no están enchufados? Así puedo decirle al usuario que se conecte los auriculares.

Tengo el siguiente código de otro hilo, pero el método audioSessionGetProperty está en desuso. Alguien sabe cómo alterar el siguiente código para hacer que esto funcione O tiene su propio código / solución.

Gracias.

- (BOOL)isHeadsetPluggedIn { UInt32 routeSize = sizeof (CFStringRef); CFStringRef route; //Maybe changing it to something like the following would work for iOS7? //AVAudioSession* session = [AVAudioSession sharedInstance]; //OSStatus error = [session setCategory:kAudioSessionProperty_AudioRoute...? //the line below is whats giving me the warning 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 = (__bridge NSString*)route; NSRange headphoneRange = [routeStr rangeOfString : @"Head"]; if (headphoneRange.location != NSNotFound) return YES; } return NO; }


El código de @ Warif en Swift 2.0 con pocos cambios ...

func audioRouteChangeListenerCallback (notif: NSNotification){ let userInfo:[NSObject:AnyObject] = notif.userInfo! println("/(userInfo)") let routChangeReason = UInt((userInfo[AVAudioSessionRouteChangeReasonKey]?.integerValue)!) switch routChangeReason { case AVAudioSessionRouteChangeReason.NewDeviceAvailable.rawValue: self.println("Headphone/Line plugged in"); break; case AVAudioSessionRouteChangeReason.OldDeviceUnavailable.rawValue: //If the headphones was pulled move to speaker do { try AVAudioSession.sharedInstance().overrideOutputAudioPort(AVAudioSessionPortOverride.Speaker) } catch _ { } self.println("Headphone/Line was pulled. Stopping player...."); break; case AVAudioSessionRouteChangeReason.CategoryChange.rawValue: // called at start - also when other audio wants to play self.println("AVAudioSessionRouteChangeReasonCategoryChange"); break; default: break; } }

:RE


En Swift (a partir de 1.2):

func headsetPluggedIn() -> Bool { let route = AVAudioSession.sharedInstance().currentRoute return (route.outputs as! [AVAudioSessionPortDescription]).filter({ $0.portType == AVAudioSessionPortHeadphones }).count > 0 }


Esto debería funcionar, pero no puedo probarlo ahora, lo haré por la tarde.

- (BOOL)isHeadsetPluggedIn { AVAudioSessionRouteDescription* route = [[AVAudioSession sharedInstance] currentRoute]; for (AVAudioSessionPortDescription* desc in [route outputs]) { if ([[desc portType] isEqualToString:AVAudioSessionPortHeadphones]) return YES; } return NO; }


Solo para extender la respuesta de @ Antonio. Si necesita detectar si el usuario ha desconectado o enchufado los auriculares.

#import <AVFoundation/AVFoundation.h>

// [AVAudioSession sharedInstance]; // @Boris edited: you may need it if there is no `AVAudioSession instance` created before. If doesn''t work, uncomment this line. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioRouteChangeListenerCallback:) name:AVAudioSessionRouteChangeNotification object:nil]; // don''t forget to `removeObserver:`

// If the user pulls out he headphone jack, stop playing. - (void)audioRouteChangeListenerCallback:(NSNotification*)notification { NSDictionary *interuptionDict = notification.userInfo; NSInteger routeChangeReason = [[interuptionDict valueForKey:AVAudioSessionRouteChangeReasonKey] integerValue]; switch (routeChangeReason) { case AVAudioSessionRouteChangeReasonNewDeviceAvailable: NSLog(@"AVAudioSessionRouteChangeReasonNewDeviceAvailable"); NSLog(@"Headphone/Line plugged in"); break; case AVAudioSessionRouteChangeReasonOldDeviceUnavailable: NSLog(@"AVAudioSessionRouteChangeReasonOldDeviceUnavailable"); NSLog(@"Headphone/Line was pulled. Stopping player...."); break; case AVAudioSessionRouteChangeReasonCategoryChange: // called at start - also when other audio wants to play NSLog(@"AVAudioSessionRouteChangeReasonCategoryChange"); break; } }


Versión de Swift 3.0

  • Método para verificar si los auriculares están enchufados o cualquier dispositivo Bluetooth con salida de audio conectada

func bluetoothOrHeadphonesConnected() -> Bool { let outputs = AVAudioSession.sharedInstance().currentRoute.outputs for output in outputs{ if output.portType == AVAudioSessionPortBluetoothA2DP || output.portType == AVAudioSessionPortBluetoothHFP || output.portType == AVAudioSessionPortBluetoothLE || output.portType == AVAudioSessionPortHeadphones { return true } } return false }

  • Es importante verificar si los auriculares están enchufados mientras escuchas cualquier audio.

private func setupObservers() { NotificationCenter.default.addObserver(self, selector: #selector(self.audioRouteChangeListener), name: .AVAudioSessionRouteChange, object: nil) } func audioRouteChangeListener(notification: Notification) { guard let audioRouteChangeReason = notification.userInfo![AVAudioSessionRouteChangeReasonKey] as? Int else { return } switch audioRouteChangeReason { case AVAudioSessionRouteChangeReason.oldDeviceUnavailable.hashValue: //plugged out default: break } }


[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(plugout:) name:AVAudioSessionRouteChangeNotification object:nil]; -(void)plugout:(NSNotification*)notification { isRemovedHeadset = YES; }

y maneja tu código usando this isRemovedHeadset boolean en tu

if (moviePlayer.playbackState == MPMoviePlaybackStatePaused) { if(isRemovedHeadset) { isRemovedHeadset = NO; [moviePlayer prepareToPlay]; [moviePlayer play]; return; } }