0

这似乎是一个非常基本的问题,但我正在努力寻找答案。据我所知,AVAudioInputNode 自 iOS 8 以来就已经可用,例如,它可用于从 iPhone 上的麦克风进行录音。

我以前知道我会使用 AVAudioRecorderSession 来请求记录和检查我是否有权限等。我正在努力的是在使用 AVAudioEngine 时查看如何请求和检查权限。

所以在下面这样的事情中,我将如何去做呢?

import AVFoundation

class ViewController: UIViewController {
    let audioEngine = AVAudioEngine()
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBAction func recordPressed(sender:AnyObject) {
        try! startRecording()
    }

    func startRecording() throws{
        let audioSession = AVAudioSession.sharedInstance()
        try audioSession.setCategory(AVAudioSessionCategoryRecord)
        try audioSession.setMode(AVAudioSessionModeMeasurement)
        try audioSession.setActive(true, withOptions: .NotifyOthersOnDeactivation)

        guard let inputNode = audioEngine.inputNode else { fatalError("Audio engine has no input node") }

        let recordingFormat = inputNode.outputFormatForBus(0)

        inputNode.installTapOnBus(0, bufferSize: 1024, format: recordingFormat) { (buffer: AVAudioPCMBuffer, when: AVAudioTime) in

        }

        audioEngine.prepare()

        try audioEngine.start()


    }

}

我注意到可以在 plist 中设置麦克风隐私消息,并且调用 audioEngine.inputNode 似乎会显示此消息。但是我仍然看不到在哪里检查是否已授予该权限。如果我添加

   if (audioSession.recordPermission() == AVAudioSessionRecordPermission.granted){

    }else{
        print("No permission")
    }

直接在guard let inputNode它显示消息的行之后,但总是告诉我在我响应警报之前没有授予权限。

解决这个问题的最佳方法是什么?我应该先回退到使用 audioSession 方法吗?值得一提的是,这是从 SpeechRecognizer 周围的 WWDC 代码中提取的。我只是看不到他们在哪里处理麦克风权限

事实上,它似乎并不总是显示请求权限的警报。我在这里缺少什么,因为我发现的示例似乎跳过了这个权限步骤

4

1 回答 1

0

好的,所以查看文档我发现了这个:

录制音频需要用户的明确许可。当您的应用程序的音频会话在使用启用录制的类别时第一次尝试使用音频输入路由时,系统会自动提示用户许可。您可以通过调用此方法更早地明确询问。在用户授予您的应用录制权限之前,您的应用只能录制静音。

此方法总是立即返回,但如果用户之前未授予或拒绝在您的应用中记录的权限,则响应块会等待用户输入。

当用户响应您的应用程序的录制权限提示时,系统会记住该选择。如果用户拒绝了录音权限,他们可以在“设置”>“隐私”>“麦克风”中重新启用它。

所以看起来它在第一次尝试使用麦克风时会自动执行,但理想情况下我应该提前请求这个权限

于 2016-07-15T10:37:31.223 回答