Разрешение AVAudioInputNode

Это может показаться очень простым вопросом, но я изо всех сил пытаюсь найти ответ. Насколько мне известно, 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? Как бы то ни было, многое из этого было взято из кода WWDC, относящегося к speechRecognizer. Я просто не вижу, где они управляют разрешением микрофона.

На самом деле не всегда появляется предупреждение о запросе разрешений. Что мне здесь не хватает, поскольку примеры, которые я нашел, похоже, пропускают этот шаг разрешения


person TommyBs    schedule 15.07.2016    source источник


Ответы (1)


Итак, просматривая документы, я нашел это:

Для записи звука требуется явное разрешение пользователя. В первый раз, когда аудиосеанс вашего приложения пытается использовать входной аудиомаршрут при использовании категории, которая разрешает запись, система автоматически запрашивает у пользователя разрешение. Вы можете явно спросить раньше, вызвав этот метод. Пока пользователь не предоставит вашему приложению разрешение на запись, ваше приложение может записывать только тишину.

Этот метод всегда возвращает результат немедленно, но блок ответа ожидает ввода пользователем, если пользователь ранее не предоставил или не запретил разрешение на запись в вашем приложении.

Когда пользователь отвечает на запрос разрешения на запись для вашего приложения, система запоминает его выбор. Если пользователь запретил запись, он может снова включить ее в меню «Настройки» > «Конфиденциальность» > «Микрофон».

Так что похоже, что он делает это автоматически при первой попытке использовать микрофон, но в идеале я должен спросить это разрешение заранее.

person TommyBs    schedule 15.07.2016