2015-02-12 94 views
12

音量按鈕通知功能未被調用。檢測音量按鈕按

代碼:

func listenVolumeButton(){ 
    // Option #1 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "volumeChanged:", name: "AVSystemController_SystemVolumeDidChangeNotification", object: nil) 
    // Option #2 
    var audioSession = AVAudioSession() 
    audioSession.setActive(true, error: nil) 
    audioSession.addObserver(self, forKeyPath: "volumeChanged", options: NSKeyValueObservingOptions.New, context: nil) 
} 

override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) { 
    if keyPath == "volumeChanged"{ 
     print("got in here") 
    } 
} 

func volumeChanged(notification: NSNotification){ 
    print("got in here") 
} 

listenVolumeButton()被稱爲viewWillAppear中

的代碼是沒有得到的打印語句"got in here",在這兩種情況下。

我正在嘗試兩種不同的方式來做到這一點,兩種方式都沒有問題。

我都遵循這樣的:Detect iPhone Volume Button Up Press?

回答

18

使用第二種方法,關鍵路徑的值應爲"outputVolume"。這是我們正在觀察的財產。 所以更改代碼,

func listenVolumeButton(){ 

    let audioSession = AVAudioSession.sharedInstance() 
    audioSession.setActive(true, error: nil) 
    audioSession.addObserver(self, forKeyPath: "outputVolume", 
     options: NSKeyValueObservingOptions.New, context: nil) 
} 

override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, 
    change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) { 
    if keyPath == "outputVolume"{ 
     print("got in here") 
    } 
} 
+1

乾杯,我很感激幫助! – AustinT 2015-02-12 10:23:11

+3

當音量達到最大值時,是否仍可以獲取通知? – AustinT 2015-02-12 10:24:33

+0

沒有。它不可能使用這種方法。 – rakeshbs 2015-02-12 10:25:11

14

上面的代碼不會在雨燕3工作,在這種情況下,試試這個:

func listenVolumeButton() { 
    do { 
    try audioSession.setActive(true) 
    } catch { 
    print("some error") 
    } 
    audioSession.addObserver(self, forKeyPath: "outputVolume", options: NSKeyValueObservingOptions.new, context: nil) 
} 

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { 
    if keyPath == "outputVolume" { 
    print("got in here") 
    } 
} 
3
import AVFoundation 
import MediaPlayer 

override func viewDidLoad() { 
    super.viewDidLoad() 
    let volumeView = MPVolumeView(frame: CGRect.zero) 
    for subview in volumeView.subviews { 
    if let button = subview as? UIButton { 
     button.setImage(nil, for: .normal) 
     button.isEnabled = false 
     button.sizeToFit() 
    } 
    } 
    UIApplication.shared.windows.first?.addSubview(volumeView) 
    UIApplication.shared.windows.first?.sendSubview(toBack: volumeView) 
} 

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 
    AVAudioSession.sharedInstance().addObserver(self, forKeyPath: "outputVolume", options: NSKeyValueObservingOptions.new, context: nil) 
    do { try AVAudioSession.sharedInstance().setActive(true) } 
    catch { debugPrint("\(error)") } 
} 

override func viewDidDisappear(_ animated: Bool) { 
    super.viewDidDisappear(animated) 
    AVAudioSession.sharedInstance().removeObserver(self, forKeyPath: "outputVolume") 
    do { try AVAudioSession.sharedInstance().setActive(false) } 
    catch { debugPrint("\(error)") } 
} 

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { 
    guard let key = keyPath else { return } 
    switch key { 
    case "outputVolume": 
     guard let dict = change, let temp = dict[NSKeyValueChangeKey.newKey] as? Float, temp != 0.5 else { return } 
     let systemSlider = MPVolumeView().subviews.first { (aView) -> Bool in 
     return NSStringFromClass(aView.classForCoder) == "MPVolumeSlider" ? true : false 
    } as? UISlider 
     systemSlider?.setValue(0.5, animated: false) 
     guard systemSlider != nil else { return } 
     debugPrint("Either volume button tapped.") 
    default: 
     break 
    } 
} 

當觀察一個新的價值,我設置系統音量回到0.5。這可能會激怒用戶同時使用音樂,因此我不建議我在生產中自己的答案。