音量按钮通知 iPhone

4

我想在音量按钮(手机左侧的按钮)被按下时收到通知。我做了很多谷歌搜索,似乎应该使用mediaPlayer,但由于我是iOS和Swift的新手,无法运行它。以下是我的操作:

import UIKit
import MediaPlayer
class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        var mediaPlayer: MPMusicPlayerController = MPMusicPlayerController()

        NSNotificationCenter.defaultCenter().addObserver(mediaPlayer,
            selector: "volumeIsChanged:",
            name: MPMusicPlayerControllerVolumeDidChangeNotification,
            object: nil)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    func volumeIsChanged(notification: NSNotification){
        println("Volume Is Changed")
    }
}

PS:我知道,改变iPhone硬件的行为不被苹果所期望。


你能解决这个问题吗? - AustinT
2个回答

1

try this:

func hookVolume() {
    var volumeView = MPVolumeView(frame: CGRectMake(-500, -500, 0, 0)) 
    self.window?.addSubview(volumeView)

    NSNotificationCenter.defaultCenter().addObserver(self,
        selector: "volumeChanged:",
        name: "AVSystemController_SystemVolumeDidChangeNotification",
        object: nil)

}

func volumeChanged(notification: NSNotification) {
    let volume = notification.userInfo!["AVSystemController_AudioVolumeNotificationParameter"] as! Float        
}

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    hookVolume()
}

0

对于Swift 4,更新后的代码应该是这样的。还要记得删除观察者 - 总是如此。

override func viewDidLoad() {
    super.viewDidLoad()

    // slider to visualize the volume change
    var volumeView = UISlider(frame: CGRect(x:0,y:0,width:300,height:50))
    volumeView.tag = 100
    self.view.addSubview(volumeView)

    //Add observer for the volume change event
    NotificationCenter.default.addObserver(self, selector: #selector(NowPlayingViewController.volumeChanged(_:)), name: NSNotification.Name("AVSystemController_SystemVolumeDidChangeNotification"), object: nil)
}

@objc func volumeChanged(notification: NSNotification) {
    let volume = notification.userInfo!["AVSystemController_AudioVolumeNotificationParameter"] as! Float
    print("Volume value:\(volume)")

    //Get the slider by its tag
    let volumeView = self.view.viewWithTag(100) as! UISlider
    //Update the slider value to correspond to the volume
    volumeView.value = volume
}

deinit {
    // Don't forget to remove the observer
    NotificationCenter.default.removeObserver(self,
                                              name: Notification.Name("AVSystemController_SystemVolumeDidChangeNotification"),
                                              object: nil)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接