AVAudioSession Swift

11

我想写一个可以记录用户声音的Swift iOS应用程序。我已经用Swift编写了以下代码,但它无法请求用户的麦克风权限。它打印了“已授权”,但从未录制音频,并且在隐私设置下不会列出该应用程序。我该如何在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")
     }
})
3个回答

14

自从iOS 7以后, 您需要检查它是否响应选择器 requestRecordPermission:

我使用iPhone 5SiOS 8 Beta 测试了这段代码,它完美地工作了。一旦您授予权限,系统不会再次请求。

值得一提的是,在使用模拟器时没有请求权限。

这是我尝试并且正常工作的代码:

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")
        }
     })

}

我在之前的代码行进行了检查,但是它没有起作用...可能是因为我使用的是模拟器。我已经尝试将其加载到我的设备上,但是出现了一个错误,显示不支持(其他人已经提交了很多雷达问题)。感谢您在您的设备上进行测试。 - BDGapps

5

对于 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")
            }
        })
    }

4

Swift 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: []) - Adam Knights

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