iOS如何检查应用程序是否有访问麦克风的权限?

40

iOS 7推出后,当应用程序想要录制音频时,必须请求麦克风访问权限。

我该如何检查应用程序是否有麦克风权限?
在iOS 8 SDK中,可以使用AVAudioSessionRecordPermission枚举来检查,但是在iOS 7中该怎么办?

信息:
我不想请求权限,只想检查应用程序是否具有对麦克风的访问权限。(就像位置访问权限一样)

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

我在这里回答了一个类似的问题:https://dev59.com/dmMl5IYBdhLWcg3wK0WA#39250149 - Floris M
8个回答

85

您可以使用自 iOS 8 起提供的 recordPermission() 来检查。

请注意,从 iOS 10 开始,您必须设置您的info.plist中的 NSMicrophoneUsageDescription 属性以获取麦克风权限,并为用户包含一条消息。这条消息会在请求时显示给用户。最后,如果本地化您的应用程序,请务必包含您的 plist 字符串进行翻译。

enter image description here

如果未这样做,将在尝试访问麦克风时导致崩溃。

此答案已再次进行清理以适用于 Swift 5.x

import AVFoundation

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

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 已导入。


请注意,需要添加到您的info.plist文件中的属性是NSMicrophoneUsageDescription。 - Elijah
1
@Harris 谢谢,我的截图裁剪了一下,但我会把它表述得更明确。 - CodeBender

33
在中没有获取当前麦克风授权状态的方法。在中,他们提供了一个枚举类型AVAudioSessionRecordPermission
在中,您需要每次请求权限。
[[AVAudioSession sharedInstance] requestRecordPermission:^(BOOL granted) {
        if (granted) {
            NSLog(@"Permission granted");
        }
        else {
            NSLog(@"Permission denied");
        }
    }];

之前曾有人提出过类似的问题,但是没有这样的 API 可以让你知道当前状态,就像 iOS8 那样。

你可以参考 在 iOS 7 上检查麦克风权限而不显示提示

解决方法:

另一个选项是你可以在第一次 显示弹出窗口或请求权限,并在NSUserDefaults中保存用户选项的状态,从那时开始不再请求权限。依据文档,如果您不需要获取用户的权限,则无需每次调用此方法。当您尝试录制时,系统会首先通过 AVAudioSession 自动调用。

录制音频需要得到用户的明确许可。每当您的应用程序的音频会话在使用启用录制的类别时尝试使用音频输入路由时,系统都会自动提示用户授权;或者,您可以在适当的时候调用 requestRecordPermission: 来提示用户。


13

Swift 3完整解决方案代码

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
    }

这不起作用,因为requestRecordPermission是异步调用的。它总是返回true - Martin Mlostek
你可以在Objective-C中使用信号量,或者在Swift中使用DispatchGroup,在这种情况下,你可以等待结果,然后返回它。 - Guilherme Crozariol

11

你可以尝试以下代码来解决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
}

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

请包含 <AVFoundation/AVAudioSession.h>


1
我不想请求录音权限,我只想检查应用程序是否可以访问麦克风(就像位置访问一样:“[CLLocationManager authorizationStatus]”)。 - lukas
1
它将在第一次请求时询问,以后不会再次询问。 - souvickcse
那么我只能在iOS 8中检查麦克风访问权限吗? - lukas
我尝试了这个,但它说在对象类型AVAudioSession上找不到属性requestRecordPermission。 - user2899094
你能分享一个虚拟项目吗? - souvickcse

5
我通常用以下方式快速检查与音频记录相关的对象:
// swift 5 
static public func isAuthorized() -> Bool {
    return AVCaptureDevice.authorizationStatus(for: .audio) == .authorized
}

4

由于其他答案没有提到这一点,您需要将权限添加到info.plist中。具体来说,添加以下条目:

隐私-麦克风使用说明

对于字符串值,请输入类似以下内容:(应用程序名称) 需要访问您的麦克风。

否则,您会遇到神秘的崩溃。


3

导入AVFoundation并使用以下函数

var permissionCheck:Bool = false

switch AVAudioSession.sharedInstance().recordPermission {

        case AVAudioSession.RecordPermission.granted:
            permissionCheck = true

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

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