IOS проверяет, имеет ли приложение доступ к микрофону

С введением iOS 7 приложения должны запросить доступ к микрофонам, когда они хотят записывать аудио.

Как проверить, имеет ли приложение доступ к микрофону?
В SDK iOS 8 я могу использовать перечисление AVAudioSessionRecordPermission, но как это проверить в iOS 7?

Info:
Я не хочу запрашивать разрешение, я просто хочу проверить, имеет ли приложение доступ к микрофону. (Как доступ к местоположению):

if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusDenied) {
    // Do something
}

Ответы

Ответ 1

В iOS7 нет способа получить текущий статус microphone authorization. Они указали enum в iOS8 как AVAudioSessionRecordPermission

В iOS7 вы должны каждый раз запрашивать разрешение с помощью

[[AVAudioSession sharedInstance] requestRecordPermission:^(BOOL granted) {
        if (granted) {
            NSLog(@"Permission granted");
        }
        else {
            NSLog(@"Permission denied");
        }
    }];

Тот же вопрос задан раньше, но нет такого api, с которым вы знаете текущий статус, как в iOS8

Вы можете сослаться Проверить разрешение микрофона на iOS 7 без отображения подсказки

Решение:

Другой вариант - вы можете показать popup или запросить разрешение в первый раз и сохранить параметры состояния пользователя, выбранные в NSUserDefaults, а затем не запрашивать разрешения. Из документов вам явно не нужно вызывать это, если вам не нужно получать разрешение пользователя. Он будет автоматически вызываться AVAudioSession при первом попытке записи

Для записи звука требуется явное разрешение пользователя. Первый время вашего сеанса аудиозаписей приложений пытается использовать маршрут ввода аудио используя категорию, которая позволяет записывать (см. "Аудиосессия" Категории "), система автоматически запрашивает пользователя для разрешение; альтернативно, вы можете позвонить requestRecordPermission: to подскажите пользователю в удобное для вас время

Ответ 2

Вы можете проверить с помощью recordPermission(), который был доступен с iOS 8.

Имейте в виду, что начиная с iOS 10 вы также должны установить флаг info.plist для разрешения микрофона.

введите описание изображения здесь

Этот ответ был снова очищен для Swift 4.0

import AVFoundation

switch AVAudioSession.sharedInstance().recordPermission() {
case AVAudioSessionRecordPermission.granted:
    print("Permission granted")
case AVAudioSessionRecordPermission.denied:
    print("Pemission denied")
case AVAudioSessionRecordPermission.undetermined:
    print("Request permission here")
    AVAudioSession.sharedInstance().requestRecordPermission({ (granted) in
        // Handle granted
    })
}

Swift 3.0

Это проверено на среду iOS 10 для проверки текущего состояния микрофона.

    switch AVAudioSession.sharedInstance().recordPermission() {
    case AVAudioSessionRecordPermission.granted:
        print("Permission granted")
    case AVAudioSessionRecordPermission.denied:
        print("Pemission denied")
    case AVAudioSessionRecordPermission.undetermined:
        print("Request permission here")
    default:
        break
    }

Objective-C

Я проверил этот код с iOS 8 с целью проверки разрешения микрофона и получения текущего состояния.

switch ([[AVAudioSession sharedInstance] recordPermission]) {
    case AVAudioSessionRecordPermissionGranted:

        break;
    case AVAudioSessionRecordPermissionDenied:

        break;
    case AVAudioSessionRecordPermissionUndetermined:
        // This is the initial state before a user has made any choice
        // You can use this spot to request permission here if you want
        break;
    default:
        break;
}

Как всегда, убедитесь, что import AVFoundation.

Ответ 3

Есть еще один способ попробовать следующий код для ios 7 и 8:

let microPhoneStatus = AVCaptureDevice.authorizationStatusForMediaType(AVMediaTypeAudio)

switch microPhoneStatus {
    case .Authorized:
        // Has access
    case .Denied:
        // No access granted
    case .Restricted:
        // Microphone disabled in settings
    case .NotDetermined:
        // Didn't request access yet
}

Ответ 4

[[AVAudioSession sharedInstance] requestRecordPermission:^(BOOL granted) {
        if (granted) {
            // Microphone enabled code
        }
        else {
            // Microphone disabled code
        }
    }];

И включите <AVFoundation/AVAudioSession.h>

Ответ 5

Swift 3 Complete Solution Code

func checkMicPermission() -> Bool {

        var permissionCheck: Bool = false

        switch AVAudioSession.sharedInstance().recordPermission() {
        case AVAudioSessionRecordPermission.granted:
            permissionCheck = true
        case AVAudioSessionRecordPermission.denied:
            permissionCheck = false
        case AVAudioSessionRecordPermission.undetermined:
            AVAudioSession.sharedInstance().requestRecordPermission({ (granted) in
                if granted {
                    permissionCheck = true
                } else {
                    permissionCheck = false
                }
            })
        default:
            break
        }

        return permissionCheck
    }

Ответ 6

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

Конфиденциальность - Описание использования микрофона

Для значения String введите что-то вроде:   (Имя приложения) требуется доступ к вашему микрофону.

В противном случае вы получите таинственный сбой