随着iOS 7的推出,应用程序必须在想要录制音频时请求麦克风访问。
如何检查应用程序是否可以访问麦克风?
在iOS 8 SDK中,我可以使用AVAudioSessionRecordPermission
枚举,但如何在iOS 7中查看?
的信息:
我不想申请许可,我只想检查应用是否可以访问麦克风。 (如位置访问权限):
if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusDenied) {
// Do something
}
答案 0 :(得分:57)
您可以查看自iOS 8以来可用的recordPermission()。
请注意,从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
}
<强>目标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
}