iOS没有开放隐式控制音量的api,这或许与其安全策略有关(试想一个app每次启动的时候都会偷偷将你音量开到最大)。
但MediaPlayer提供了一个用于控制音量的UI控件:MPVolumeView,它包含一个UISlider可以用来手动控制音量。
以下是用法:
static let volumeView = MPVolumeView()
//设置静音
class func muteForPhoneToTV(){
let ary = volumeView.subviews
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
for subView in ary {
if let slider = subView as? UISlider {
slider.setValue(0.0, animated: false)//范围0-1
break
}
}
}
}
//获取音量:
var v:Float = 0.0
for subViews in volumeView.subviews {
if let slider = subViews as? UISlider {
v = slider.value
break
}
}
MPVolumeView初始化后,直接执行slider.setValue有时会设置失败,推测其中会有异步问题,所以代码中加了一点延时。
注意1:
当我用AVAudioSession.sharedInstance().outputVolume获取音量时,获取到的总是MPVolumeView调整音量前的音量,所以正确的获取音量方法是:获取MPVolumeView的slider.value
注意2:
当设置slider.value时,系统的音量UI(垂直的音量条)会出现。一些资料显示,若不想显示将系统的音量UI条,需要将MPVolumeView添加到UI上。且透明度不能为0,(不知道添加至超出可显示区域的frame行不行)