iOS检查应用程序是否有权访问麦克风

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

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

信息:
我不想要求权限,我只是想检查应用程序是否有权访问麦克风。 (如位置访问):

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

iOS7 ,无法获得microphone authorization的当前状态。他们已将iOS8的枚举iOS8 AVAudioSessionRecordPermission

iOS7你必须每次都请求权限

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

以前也有同样的问题,但是在iOS8没有这样一个你知道当前状态的iOS8

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

解:

另一个select是你可以显示popup第一次请求许可,并保存在NSUserDefaultsselect的用户选项的状态,并且不要求许可。 从文档你明确不需要调用这个,如果你不需要获得用户的权限,它会自动调用AVAudioSession当你尝试logging

录制audio需要用户的明确许可。 当您的应用程序的audio会话第一次尝试使用audioinputpath而使用启用录制的类别时(请参阅“audio会话类别”),系统将自动提示用户获得许可; 或者,您可以调用requestRecordPermission:在您select的时间提示用户

您可以检查自iOS 8以来已经可用的recordPermission() 。

请记住,从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环境下进行了testing,用于检查麦克风的当前状态。

  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 8testing了这个代码,目的是检查麦克风权限并获取当前状态。

 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

还有另一种方法可以尝试下面的代码为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 } 
 [[AVAudioSession sharedInstance] requestRecordPermission:^(BOOL granted) { if (granted) { // Microphone enabled code } else { // Microphone disabled code } }]; 

并包含<AVFoundation/AVAudioSession.h>

由于这里没有其他的答案提到这个,你需要添加权限到你的info.plist。 具体来说,添加一个条目:

隐私 – 麦克风使用说明

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

否则,你会得到一个神秘的崩溃

Swift 3完整的解决scheme代码

 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 }