获取iOS系统音量

49

我的情况很简单:我需要播放一个警告信号,并确保用户能听到它,因此我想检查系统音量。

我如何找出当前系统音量是多少?

8个回答

50

Swift 更新通知

let vol = AVAudioSession.sharedInstance().outputVolume

音频会话可以提供输出音量 (iOS >= 6.0)。

float vol = [[AVAudioSession sharedInstance] outputVolume];
NSLog(@"output volume: %1.2f dB", 20.f*log10f(vol+FLT_MIN));

我在 iOS 11 中使用了 Today Extension,但有时它不起作用。 - Vyachaslav Gerchicov
尝试播放音频并检查。我遇到了同样的问题,这对我有用。 - Tom Andersen
请确保先执行AVAudioSession.sharedInstance().setActive(true),否则当音量改变时,该值将不会更新。 - rolling_codes
只是一个小问题:返回的值不是可以直接转换为分贝的比率/增益。该值直接反映了音量指示器的位置,而苹果并没有宣传它与实际增益或分贝值的关系。最有可能的是它是映射到分贝范围的比例尺,但是这个比例尺是什么,任何人都无法猜测。 - Michael Tyson

16

Swift 3.1

let audioSession = AVAudioSession.sharedInstance()
var volume: Float?
do {
    try audioSession.setActive(true)
    volume = audioSession.outputVolume
} catch {
    print("Error Setting Up Audio Session")
}

audioSession.setActive(true) - important


1
你能分享一下为什么setActive(true)很重要吗? - Jayden Irwin

13

试试这个:

MPMusicPlayerController *iPod = [MPMusicPlayerController iPodMusicPlayer];
float volumeLevel = iPod.volume;

您需要导入MediaPlayer框架。


9
已经不推荐使用,应该使用[[AVAudioSession sharedInstance] outputVolume]代替。 - Borzh

12

这个很好用:

Float32 volume;
UInt32 dataSize = sizeof(Float32);

AudioSessionGetProperty (
                     kAudioSessionProperty_CurrentHardwareOutputVolume,
                     &dataSize,
                     &volume
                     );

在我的情况下甚至更好!现在我可以放弃MediaPlayer框架了。 - Joris van Liempd iDeveloper
7
这在iOS 7中已被弃用 - 有人知道新的方法吗? - Michael Forrest

12

对于Swift 2

let volume = AVAudioSession.sharedInstance().outputVolume   
print("Output volume: \(volume)")

1
我们还需要 audioSession.setActive(true) - Tai Le

5

您可以使用默认系统的音量视图,并将其添加到需要的位置。在我的情况下,我需要它在自己的音乐播放器中。这很容易且无需麻烦。只需添加视图,一切都完成了。这在苹果的MPVolume Class Reference中有解释。

mpVolumeViewParentView.backgroundColor = [UIColor clearColor];
MPVolumeView *myVolumeView =
[[MPVolumeView alloc] initWithFrame: mpVolumeViewParentView.bounds];
[mpVolumeViewParentView addSubview: myVolumeView];
[myVolumeView release];

问题不在于如何为用户提供改变音量的方式,而在于如何检测音量是否足够高。这个回答能帮到你吗? - Joris van Liempd iDeveloper
1
True并不特别相关于问题,但在调整系统音量的整体背景下仍然很有用。 - Warren Burton

2

我准备了一个包含静态方法的类,以处理iOS设备的音量问题。让我与您分享:

import AVFoundation
class HeadPhoneDetectHelper {
class func isHeadPhoneConnected() -> Bool
{
    do{
        let audioSession = AVAudioSession.sharedInstance()
        try audioSession.setActive(true)
        let currentRoute = audioSession.currentRoute
        let headPhonePortDescriptionArray = currentRoute.outputs.filter{$0.portType == AVAudioSessionPortHeadphones}
        let isHeadPhoneConnected = headPhonePortDescriptionArray.count != 0
        return isHeadPhoneConnected
    }catch{
        print("Error while checking head phone connection : \(error)")
    }
    return false
}

class func isVolumeLevelAppropriate() -> Bool
{
    let minimumVolumeLevelToAccept = 100
    let currentVolumeLevel = HeadPhoneDetectHelper.getVolumeLevelAsPercentage()
    let isVolumeLevelAppropriate = currentVolumeLevel >= minimumVolumeLevelToAccept
    return isVolumeLevelAppropriate
}

class func getVolumeLevelAsPercentage() -> Int
{
    do{
        let audioSession = AVAudioSession.sharedInstance()
        try audioSession.setActive(true)
        let audioVolume =  audioSession.outputVolume
        let audioVolumePercentage = audioVolume * 100
        return Int(audioVolumePercentage)
    }catch{
        print("Error while getting volume level \(error)")
    }
    return 0
}
}

1

Swift 2.2,请确保导入MediaPlayer

private func setupVolumeListener()
{
    let frameView:CGRect = CGRectMake(0, 0, 0, 0)
    let volumeView = MPVolumeView(frame: frameView)
    //self.window?.addSubview(volumeView) //use in app delegate
   self.view.addSubview(volumeView)  //use in a view controller


    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(volumeChanged(_:)), name: "AVSystemController_SystemVolumeDidChangeNotification", object: nil)
}//eom



func volumeChanged(notification:NSNotification)
{
    let volume = notification.userInfo!["AVSystemController_AudioVolumeNotificationParameter"]
    let category = notification.userInfo!["AVSystemController_AudioCategoryNotificationParameter"]
    let reason = notification.userInfo!["AVSystemController_AudioVolumeChangeReasonNotificationParameter"]

    print("volume:      \(volume!)")
    print("category:    \(category!)")
    print("reason:      \(reason!)")
    print("\n")
}//eom

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