Вземете System Volume iOS

Моят случай е прост: трябва да пусна предупредителен сигнал и искам да съм сигурен, че потребителят ще го чуе, така че искам да проверя силата на звука на системата.

Как мога да разбера какъв е текущият обем на системата?


person Joris van Liempd iDeveloper    schedule 31.08.2011    source източник


Отговори (8)


Актуализация за 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));
person papahabla    schedule 06.05.2013
comment
Използвам разширение iOS 11 in today - понякога не работи - person Vyachaslav Gerchicov; 21.05.2018
comment
stackoverflow.com/questions/24872409/ - опитайте да пуснете аудио и след това проверете. Имах същия проблем, работеше за мен. - person Tom Andersen; 12.09.2018
comment
Не забравяйте първо да направите AVAudioSession.sharedInstance().setActive(true) или тази стойност няма да се актуализира при промяна на силата на звука - person NoodleOfDeath; 10.01.2020
comment
Само малко притеснение: върнатата стойност не е съотношение/усилване, което може директно да се преобразува в децибели по този начин. Стойността директно отразява позицията на индикатора за силата на звука и Apple не рекламират как това се отнася до действителната печалба или стойност в децибели. Най-вероятно това е скала, съпоставена с диапазон от децибели, но всеки може да познае каква е скалата. - person Michael Tyson; 21.04.2020

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) - важно

person Vasilii Muravev    schedule 08.05.2017
comment
Можете ли да споделите защо setActive(true) е важен? - person Jayden Irwin; 17.07.2021

Опитайте тази:

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

Трябва да импортирате рамката на MediaPlayer.

person borked    schedule 19.09.2011
comment
Той е остарял, вместо това използвайте [[AVAudioSession sharedInstance] outputVolume]. - person Borzh; 11.02.2015

Това работи добре:

Float32 volume;
UInt32 dataSize = sizeof(Float32);

AudioSessionGetProperty (
                     kAudioSessionProperty_CurrentHardwareOutputVolume,
                     &dataSize,
                     &volume
                     );
person ziguli    schedule 17.10.2011
comment
Още по-добре в моя случай! Сега мога да се откажа от MediaPlayer Framework. - person Joris van Liempd iDeveloper; 17.10.2011
comment
Това е отхвърлено в iOS 7 - някой знае ли новия начин? - person Michael Forrest; 26.11.2013

За Swift 2:

let volume = AVAudioSession.sharedInstance().outputVolume   
print("Output volume: \(volume)")
person Dasoga    schedule 17.03.2016
comment
Имаме нужда и от audioSession.setActive(true) - person Tai Le; 28.10.2018


Подготвил съм клас със статични методи, за да се справя с обема на 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
}
}
person Suat KARAKUSOGLU    schedule 03.02.2016

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
person LuAndre    schedule 27.05.2016