铃声音量滑块,快速

Posted

技术标签:

【中文标题】铃声音量滑块,快速【英文标题】:Ringer volume slider, swift 【发布时间】:2017-02-04 23:44:29 【问题描述】:

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

【问题讨论】:

***.com/questions/3651252/… 可能有用 您好,感谢您的回复。系统音量(他们在该链接中所指的内容)是否包括铃声音量? 【参考方案1】:

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

过去曾经有一个使用 Objective-C 的解决方法,但我不太确定它是否仍然有效,如果您愿意,欢迎您尝试。

AVSystemController

【讨论】:

感谢您的快速回复,我将在接下来的几个小时内研究该方法:)【参考方案2】:

也可以检查设备是否静音?

这个问题真的很令人沮丧,我不敢相信苹果让它这么难:(

检查音量本身相当简单:

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
    

希望这可以帮助某人:)

【讨论】:

以上是关于铃声音量滑块,快速的主要内容,如果未能解决你的问题,请参考以下文章

iPhone:如何播放忽略音量和铃声开关设置的声音?

iOS使用虚拟AVAudioPlayer从铃声切换到系统音量

播放结束后将音量控制返回给 iOS 设备铃声

AudioServicesPlaySystem音量控制

按下音量按钮时更改音量滑块位置

无法在我的 iphone 应用程序中调整音量