AVAudioSession 斯威夫特

Posted

技术标签:

【中文标题】AVAudioSession 斯威夫特【英文标题】:AVAudioSession Swift 【发布时间】:2014-06-20 01:47:34 【问题描述】:

我正在尝试编写一个快速的 ios 应用程序来记录用户的声音。我已经快速编写了以下代码,但是它无法向用户请求麦克风权限。它打印授权但它从不记录音频,并且在隐私下的设置窗格中它没有列出该应用程序。如何在 swift 中请求录制权限?

var session: AVAudioSession = AVAudioSession.sharedInstance()
session.requestRecordPermission((granted: Bool)-> Void in
     if granted 
          println(" granted")
          session.setCategory(AVAudioSessionCategoryPlayAndRecord, error: nil)
          session.setActive(true, error: nil)
          self.recorder.record()
     else
          println("not granted")
     
)

【问题讨论】:

【参考方案1】:

从 iOS 7 开始,您需要检查它是否响应选择器 requestRecordPermission:

我已经使用带有 iOS 8 BetaiPhone 5S 测试了这段代码,它运行良好。一旦您授予权限,系统将不会再次请求它。

值得一提的是,它在使用模拟器时并没有请求许可。

这是我尝试过并且正在运行的代码:

if (session.respondsToSelector("requestRecordPermission:")) 
    AVAudioSession.sharedInstance().requestRecordPermission((granted: Bool)-> Void in
        if granted 
            println("granted")
            session.setCategory(AVAudioSessionCategoryPlayAndRecord, error: nil)
            session.setActive(true, error: nil)
            self.recorder ()
         else
            println("not granted")
        
     )


【讨论】:

我确实检查了我之前没有发布的行并且它没有工作......可能是因为我正在使用模拟器。我已经尝试加载到我的设备上,但是有一个错误,它说它不受支持(许多雷达也已被其他人提交)。感谢您在您的设备上进行测试。【参考方案2】:

对于Swift 3

let session = AVAudioSession.sharedInstance()
    if (session.responds(to: #selector(AVAudioSession.requestRecordPermission(_:)))) 
        AVAudioSession.sharedInstance().requestRecordPermission((granted: Bool)-> Void in
            if granted 
                Linphone.manager.callUser(username: username)

                print("granted")

                do 
                    try session.setCategory(AVAudioSessionCategoryPlayAndRecord)
                    try session.setActive(true)
                
                catch 

                    print("Couldn't set Audio session category")
                
             else
                print("not granted")
            
        )
    

【讨论】:

【参考方案3】:

斯威夫特 5

var session: AVAudioSession = AVAudioSession.sharedInstance()
@IBAction func btnmike(_ sender: Any) 
   // let session = AVAudioSession.sharedInstance()
    if (session.responds(to: #selector(AVAudioSession.requestRecordPermission(_:)))) 
        AVAudioSession.sharedInstance().requestRecordPermission((granted: Bool)-> Void in
            if granted 
                print("granted")

                do 
                    try self.session.setCategory(AVAudioSessionCategoryPlayAndRecord)
                    try self.session.setActive(true)
                
                catch 

                    print("Couldn't set Audio session category")
                
             else
                print("not granted")
            
        )
    

【讨论】:

在 xcode 10.1 中,我不得不将 session.setCategory(AVAudioSessionCategoryPlayAndRecord) 更改为 session.setCategory(.playAndRecord, mode: .default, options: [])

以上是关于AVAudioSession 斯威夫特的主要内容,如果未能解决你的问题,请参考以下文章

斯威夫特:非托管 AVAudioPlayer

使用音频会话录制时如何减少录制噪音?

AVAudioSession 学习笔记

iOS 音频-AVAudioSession

何时使用AVAudioSession.setActive?

AVAudioSession 和 AirPods