您可以使用recordPermission()进行检查,此功能自iOS 8起可用。
随着iOS 7的引入,应用程序要录制音频时必须请求麦克风访问权限。
如何检查应用程序是否可以使用麦克风?在iOS 8 SDK中,我可以使用AVAudioSessionRecordPermission
枚举,但是如何在iOS 7中进行检查?
信息:我不想请求权限,我只想检查应用程序是否可以访问麦克风。 (例如位置访问权限):
if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusDenied) {
// Do something
}
在iOS7
中无法获取microphone authorization
的当前状态。他们已将iOS8
中的枚举指定为AVAudioSessionRecordPermission
在iOS7
中,您每次都必须请求许可
[[AVAudioSession sharedInstance] requestRecordPermission:^(BOOL granted) {
if (granted) {
NSLog(@"Permission granted");
}
else {
NSLog(@"Permission denied");
}
}];
之前曾问过同样的问题,但没有iOS8
中的api可以知道当前状态>
您可以参考Check for mic permission on iOS 7 without showing prompt
解决方案:
另一个选项是您可以显示popup
或寻求许可首次
NSUserDefaults
中选择的用户选项的状态,然后不再请求许可。从文档中,如果不需要每个用户都明确地不需要调用此权限。AVAudioSession
首次尝试记录时会自动调用它。录制音频需要用户的明确许可。首先应用的音频会话尝试使用音频输入路径的时间同时使用启用录音的类别(请参阅“音频会话”类别”),系统会自动提示用户输入允许;或者,您可以调用requestRecordPermission:来在您选择的时间提示用户
您可以使用recordPermission()进行检查,此功能自iOS 8起可用。
请记住,从iOS 10开始,您必须设置
NSMicrophoneUsageDescription
中的info.plist
属性以获取麦克风权限。您必须提供一个将在访问请求中显示的值,并且如果对您的应用进行本地化,请确保包括用于转换的plist字符串。否则,尝试访问麦克风时会导致崩溃。
此答案已为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 }
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
。
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
}
还有另一种方法可以尝试针对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值,请输入类似以下内容:(应用名称)需要访问您的麦克风。
否则,您将发生神秘的崩溃
导入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
}
我经常经常做的事情是快速检查使用音频记录的对象:
// swift 5
static public func isAuthorized() -> Bool {
return AVCaptureDevice.authorizationStatus(for: .audio) == .authorized
}
您可以使用recordPermission()进行检查,此功能自iOS 8起可用。
Swift 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
}
[[AVAudioSession sharedInstance] requestRecordPermission:^(BOOL granted) {
if (granted) {
// Microphone enabled code
}
else {
// Microphone disabled code
}
}];
并包括<AVFoundation/AVAudioSession.h>
由于此处没有其他答案提及此问题,因此您需要将权限添加到info.plist。具体来说,为以下项添加一个条目:
隐私-麦克风使用说明
导入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
}
我经常经常做的事情是快速检查使用音频记录的对象:
// swift 5
static public func isAuthorized() -> Bool {
return AVCaptureDevice.authorizationStatus(for: .audio) == .authorized
}