振铃音量滑块,快捷

时间:2017-02-04 23:44:30

标签: swift audio volume mute

所以我的问题是我正在创建一个使用本地通知作为闹钟的应用。唯一的问题是,如果设备的铃声音量降低或静音,它将不播放任何声音。我知道您无法在后台执行此操作,但是可以将滑块连接到振铃器音量(如MPVolume的滑块)吗?还可以检查设备是否静音?我只想指出我知道你不能在没有用户知道的情况下简单地改变它,但我想知道前面提到的两种方法是否可行。任何有关该主题的帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

无法检测iPhone是否打开静音开关或更改“铃声”(非音量),因为Apple无法访问它们。

过去常常使用Objective-C进行解决,但我不确定它是否仍然有效,欢迎您随时尝试。

AVSystemController

答案 1 :(得分:0)

  

还可以检查设备是否静音吗?

这个问题真的令人沮丧,我无法相信苹果公司如此努力:(

检查音量本身很简单:

let audioSession = AVAudioSession.sharedInstance()
let volume: Float = audioSession.outputVolume

如果音量为0.0,则它是静音的。但真正的问题是铃声开关。

我的解决方案是播放静音(称为“silence.mp3”,长1.5秒,全部静音),并在0.5秒后检查是否还在播放。 这完全受SoundSwitch的启发:https://github.com/moshegottlieb/SoundSwitch

用法:

MyAudioPlayer.isLoudCheck()
{
    isLoud in

    print("%%% - device is loud = \(isLoud)")
}

我将音频播放器类更改为此(通常我只是用它来播放声音文件):

import AVFoundation

class MyAudioPlayer: NSObject, AVAudioPlayerDelegate
{
    private static let sharedPlayer: MyAudioPlayer =
    {
        return MyAudioPlayer()
    }()

    public var container = [String : AVAudioPlayer]()

    static func isLoudCheck(completionHandler: @escaping (Bool?) -> ())
    {
        let name = "silence"
        let key = name
        var player: AVAudioPlayer?

        for (file, thePlayer) in sharedPlayer.container
        {
            if file == key
            {
                player = thePlayer
                break
            }
        }

        if player == nil, let resource = Bundle.main.path(forResource: name, ofType: "mp3")
        {
            do
            {
                player = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: resource), fileTypeHint: AVFileTypeMPEGLayer3)
            }
            catch
            {
                print("%%% - audio error?")
            }
        }

        if let thePlayer = player
        {
            print("%%% - the player plays")
            thePlayer.delegate = sharedPlayer
            sharedPlayer.container[key] = thePlayer
            thePlayer.play()
        }


        DispatchQueue.main.asyncAfter(deadline: .now() + 0.5, execute:
        {
            if let thePlayer = player
            {
                if thePlayer.isPlaying
                {
                    print("%%% - check: playing")
                    completionHandler(true)
                }
                else
                {
                    print("%%% - check: not playing")
                    completionHandler(false)
                }
            }
        })
    }

    static func isPlaying(key: String) -> Bool?
    {
        return sharedPlayer.container[key]?.isPlaying
    }
}

希望这有助于某人:)