Desarrollo de una app para iPhone con archivos de audio que necesita ser escuchado demasiado a través de los auriculares.

¿Cómo puedo comprobar si los auriculares no estén conectados en así que puedo decir que el usuario conecte los auriculares.

Tengo el siguiente código de otro hilo, pero la audioSessionGetProperty método está en desuso. Alguien sabe como modificar el código siguiente para hacer este trabajo O tienen 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;
}
  • ¿qué entiende usted por completo código de trabajo?
InformationsquelleAutor 4GetFullOf | 2014-01-22

8 Comentarios

  1. 116

    Esto debería funcionar, pero no puedo probarlo ahora mismo, me voy a hacer en la noche.

    - (BOOL)isHeadsetPluggedIn {
        AVAudioSessionRouteDescription* route = [[AVAudioSession sharedInstance] currentRoute];
        for (AVAudioSessionPortDescription* desc in [route outputs]) {
            if ([[desc portType] isEqualToString:AVAudioSessionPortHeadphones])
                return YES;
        }
        return NO;
    }
    • muchas gracias. este funciona a la perfección!
    • Me alegro de haber ayudado a usted 🙂
    • ¿Cómo puedo poner esto en una acción
    • gran respuesta +1
    • Excelente muchas gracias.
  2. 59

    Sólo para extender @Antonio de la respuesta. Si usted necesita para detectar si el usuario ha sacado o conectado en la salida de 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;
        }
    }
    • Muchas gracias he probado esta y funciona muy bien!
    • gran respuesta +1
    • Genial, gracias!
    • Bueno apreciable código
    • Justo lo que necesitaba, gracias!
  3. 10

    Swift 3:

    Para comprobar 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
        }
    }

    A continuación, puedes print("isHeadphones connected: \(AVAudioSession.isHeadphonesConnected)")

    Escuchar a 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)
    }

    Aviso de uso de:

     if AVAudioSession.isHeadphonesConnected {
        print("Just connected headphones")
     }
    • ¿Cómo esta la respuesta a la pregunta? No responde si los auriculares están conectados o no.
    • He editado mi respuesta para incluir la verificación de los auriculares. Por favor upvote mi respuesta si fue útil para usted.
    • Buena apariencia. Gracias.
    • Hace este trabajo? No hay ningún miembro de la isHeadphonesConnected en AVAudioSession en Swift 3 developer.apple.com/documentation/avfoundation/avaudiosession
    • mire cuidadosamente el código, isHeadphonesConnected utilizados en la extensión.
  4. 4

    @Warif del código en Swift 2.0 con pequeños 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;
            }
        }

    😀

  5. 3

    En Swift (como de 1.2):

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

    Swift versión 3.0

    • Método para comprobar si los auriculares están conectados, o cualquier dispositivo Bluetooth con la salida de audio conectado
     func bluetoothOrHeadphonesConnected() -> Bool { 
    
    vamos salidas = AVAudioSession.sharedInstance().currentRoute.salidas 
    
    para la salida en las salidas{ 
    
    si la salida.portType == AVAudioSessionPortBluetoothA2DP || 
    de salida.portType == AVAudioSessionPortBluetoothHFP || 
    de salida.portType == AVAudioSessionPortBluetoothLE || 
    de salida.portType == AVAudioSessionPortHeadphones { 
    return true 
    } 
    
    } 
    
    return false 
    } 
    
    • Es importante comprobar si los auriculares están conectados a cabo mientras usted escucha un audio.
     
    privado func setupObservers() { 
    
    NotificationCenter.por defecto.addObserver(self, selector: #selector auto.audioRouteChangeListener), nombre: .AVAudioSessionRouteChange, objeto: nil) 
    
    } 
    
    func audioRouteChangeListener(notificación: Notificación) { 
    
    la guardia dejar audioRouteChangeReason = notificación.userInfo![AVAudioSessionRouteChangeReasonKey] como? Int else { volver } 
    
    interruptor de audioRouteChangeReason { 
    
    caso AVAudioSessionRouteChangeReason.oldDeviceUnavailable.hashValue: 
    //enchufado a cabo 
    
    por defecto: 
    romper 
    
    } 
    
    } 
    
    
    • Por favor, no publicar respuestas idénticas a las múltiples preguntas. Post una buena respuesta, y luego votar/bandera para cerrar las otras preguntas como duplicados. Si la pregunta no es un duplicado, adaptar sus respuestas a la pregunta.
    • Gracias por la sugerencia de @PaulRoub
    • La cuestión afirma que la aplicación necesita para ser utilizado con audífonos, en particular. El Bluetooth, puertos mencionados también se aplican a los automóviles, altavoces portátiles, etc.
  7. 0
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(plugout:) name:AVAudioSessionRouteChangeNotification object:nil];
    -(void)plugout:(NSNotification*)notification
    {
        isRemovedHeadset = YES;
    }

    y manejar su código utilizando este isRemovedHeadset booleano en su

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

    @Sajjon solución de Swift, 5 con RxSwift

    func handleRouteChange(_ notification: Notification) {
        guard
            let userInfo = notification.userInfo,
            let reasonRaw = userInfo[AVAudioSessionRouteChangeReasonKey] as? NSNumber,
            let reason = AVAudioSession.RouteChangeReason(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.rx
            .notification(AVAudioSession.routeChangeNotification)
            .subscribe(onNext: { (n) in
                self.handleRouteChange(n)
            })
            .disposed(by: disposeBag)
    }

Dejar respuesta

Please enter your comment!
Please enter your name here