Detect (listen to) audio route change in iOS 7

前端 未结 2 1386
-上瘾入骨i
-上瘾入骨i 2021-01-03 23:01

Just starting development for iOS 7, and found that AudioSession related functions and PropertyListeners are deprecated in iOS 7.

Before I use the following method

相关标签:
2条回答
  • 2021-01-03 23:33

    handle the notification AVAudioSessionRouteChangeNotification (Available in iOS 6.0 and later.)

    0 讨论(0)
  • 2021-01-03 23:59

    Try this code for Swift 4.2 :

    @objc func handleRouteChange(_ notification: Notification) {
        let reasonValue = (notification as NSNotification).userInfo![AVAudioSessionRouteChangeReasonKey] as! UInt
        let routeDescription = (notification as NSNotification).userInfo![AVAudioSessionRouteChangePreviousRouteKey] as! AVAudioSessionRouteDescription?
    
        NSLog("Route change:")
        if let reason = AVAudioSession.RouteChangeReason(rawValue: reasonValue) {
            switch reason {
            case .newDeviceAvailable:
                NSLog("     NewDeviceAvailable")
            case .oldDeviceUnavailable:
                NSLog("     OldDeviceUnavailable")
            case .categoryChange:
                NSLog("     CategoryChange")
                NSLog(" New Category: %@", AVAudioSession.sharedInstance().category.rawValue)
            case .override:
                NSLog("     Override")
            case .wakeFromSleep:
                NSLog("     WakeFromSleep")
            case .noSuitableRouteForCategory:
                NSLog("     NoSuitableRouteForCategory")
            case .routeConfigurationChange:
                NSLog("     RouteConfigurationChange")
            case .unknown:
                NSLog("     Unknown")
            @unknown default:
                NSLog("     UnknownDefault(%zu)", reasonValue)
            }
        } else {
            NSLog("     ReasonUnknown(%zu)", reasonValue)
        }
    
        if let prevRout = routeDescription {
            NSLog("Previous route:\n")
            NSLog("%@", prevRout)
            NSLog("Current route:\n")
            NSLog("%@\n", AVAudioSession.sharedInstance().currentRoute)
        }
    }
    

    And call it in func setupAudioSession()

        private func setupAudioSession() {
    
           // Configure the audio session
           let sessionInstance = AVAudioSession.sharedInstance()
    
           // we don't do anything special in the route change notification
           NotificationCenter.default.addObserver(self,
               selector: #selector(self.handleRouteChange(_:)),
               name: AVAudioSession.routeChangeNotification,
               object: sessionInstance)
    
    }
    

    For Objective C try this code

    - (void)handleRouteChange:(NSNotification *)notification
    {
        UInt8 reasonValue = [[notification.userInfo valueForKey:AVAudioSessionRouteChangeReasonKey] intValue];
        AVAudioSessionRouteDescription *routeDescription = [notification.userInfo valueForKey:AVAudioSessionRouteChangePreviousRouteKey];
    
        NSLog(@"Route change:");
        switch (reasonValue) {
            case AVAudioSessionRouteChangeReasonNewDeviceAvailable:
                NSLog(@"     NewDeviceAvailable");
                break;
            case AVAudioSessionRouteChangeReasonOldDeviceUnavailable:
                NSLog(@"     OldDeviceUnavailable");
                break;
            case AVAudioSessionRouteChangeReasonCategoryChange:
                NSLog(@"     CategoryChange");
                NSLog(@" New Category: %@", [[AVAudioSession sharedInstance] category]);
                break;
            case AVAudioSessionRouteChangeReasonOverride:
                NSLog(@"     Override");
                break;
            case AVAudioSessionRouteChangeReasonWakeFromSleep:
                NSLog(@"     WakeFromSleep");
                break;
            case AVAudioSessionRouteChangeReasonNoSuitableRouteForCategory:
                NSLog(@"     NoSuitableRouteForCategory");
                break;
            default:
                NSLog(@"     ReasonUnknown");
        }
    
        NSLog(@"Previous route:\n");
        NSLog(@"%@\n", routeDescription);
        NSLog(@"Current route:\n");
        NSLog(@"%@\n", [AVAudioSession sharedInstance].currentRoute);
    
    }
    

    And call it in (void)setupAudioSession

    - (void)setupAudioSession {
        // Configure the audio session
        AVAudioSession *sessionInstance = [AVAudioSession sharedInstance];
    
        // we don't do anything special in the route change notification
        [[NSNotificationCenter defaultCenter] addObserver:self
                                              selector:@selector(handleRouteChange:)
                                              name:AVAudioSessionRouteChangeNotification
                                              object:sessionInstance];
    }
    
    0 讨论(0)
提交回复
热议问题