iOS检查应用程序是否可以访问麦克风

时间:2014-07-27 13:16:16

标签: ios objective-c swift microphone avaudiosession

随着iOS 7的推出,应用程序必须在想要录制音频时请求麦克风访问。

如何检查应用程序是否可以访问麦克风? 在iOS 8 SDK中,我可以使用AVAudioSessionRecordPermission枚举,但如何在iOS 7中查看?

的信息:
我不想申请许可,我只想检查应用是否可以访问麦克风。 (如位置访问权限):

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

8 个答案:

答案 0 :(得分:57)

您可以查看自iOS 8以来可用的recordPermission()

请注意,从iOS 10开始,您必须在NSMicrophoneUsageDescription中设置 info.plist属性以获取麦克风权限。您必须提供将在访问请求中显示的值,如果要对您的应用进行本地化,请确保包含您的plist字符串以进行翻译。

enter image description here

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

此答案已针对 Swift 4.x

再次清理
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环境测试此项,以检查麦克风的当前状态。

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")
default:
    break
}

<强>目标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

答案 1 :(得分:23)

iOS7中无法获取microphone authorization的当前状态。他们已将iOS8中的枚举设为AVAudioSessionRecordPermission

iOS7中,您必须每次都使用

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

以前曾问过同样的问题,但是没有这样的api,你知道当前状态如iOS8

您可以参考Check for mic permission on iOS 7 without showing prompt

<强>解决方案:

另一种选择是,您可以显示popup或首次请求权限 并保存在NSUserDefaults中选择的用户选项状态,而不是向前请求权限。 如果您不需要获得用户的许可,那么您明确不需要调用此文档。当您尝试录制时,AVAudioSession会自动调用

  

录制音频需要用户明确许可。首先   应用程序的音频会话尝试使用音频输入路径的时间   使用启用录制的类别时(请参阅“音频会话”   分类“),系统自动提示用户   允许;或者,您可以调用requestRecordPermission:to   在您选择的时候提示用户

答案 2 :(得分:11)

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
    }

答案 3 :(得分:8)

还有另一种方法可以尝试使用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 :(得分:5)

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

并加入<AVFoundation/AVAudioSession.h>

答案 5 :(得分:3)

由于此处没有提到任何其他答案,您需要将权限添加到info.plist。具体来说,添加一个条目:

隐私 - 麦克风使用说明

  
    

对于String值,输入如下内容:     (应用程序名称)需要访问您的麦克风。

  

否则,你会发生神秘的崩溃

答案 6 :(得分:3)

为了经常快速检查带有音频记录的对象,我经常要做的事情:

// swift 5 
static public func isAuthorized() -> Bool {
    return AVCaptureDevice.authorizationStatus(for: .audio) == .authorized
}

答案 7 :(得分:0)

导入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
        }