¿Están enchufados los auriculares? ios 7

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; } 

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  

 // [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; } } 

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 syntax 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") } 

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 } 

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

         para salida en salidas {

             si output.portType == AVAudioSessionPortBluetoothA2DP ||
                output.portType == AVAudioSessionPortBluetoothHFP ||
                output.portType == AVAudioSessionPortBluetoothLE ||
                output.portType == AVAudioSessionPortHeadphones {
                 devolver verdadero
             }

         }

         falso retorno 
     }
  • 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 (notificación: Notificación) {

         guard let audioRouteChangeReason = notification.userInfo! [AVAudioSessionRouteChangeReasonKey] as?  Int else {return}

         cambiar audioRouteChangeReason {

             case AVAudioSessionRouteChangeReason.oldDeviceUnavailable.hashValue:
                 // enchufado

             defecto:
                 descanso

         }

     }

 [[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; } } 
Intereting Posts