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

130*_*13a 24 microphone objective-c ios avaudiosession swift

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

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

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

if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusDenied) {
    // Do something
}
Run Code Online (Sandbox Code Playgroud)

Cod*_*der 60

您可以使用自iOS 8开始提供的recordPermission()进行检查.

请记住,从iOS 10开始,您必须NSMicrophoneUsageDescriptioninfo.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
    })
}
Run Code Online (Sandbox Code Playgroud)

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
}
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

一如既往,确保import AVFoundation.


cod*_*ter 27

iOS7没有办法获得当前状态.microphone authorization他们已经将enum iOS8作为AVAudioSessionRecordPermission

iOS7你必须每次请求许可

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

之前已经问过同样的问题但是没有这样的api,你知道当前的状态如何 iOS8

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

解:

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

录制音频需要用户的明确许可.应用程序的音频会话第一次尝试使用音频输入路径时使用启用录音的类别(参见"音频会话类别"),系统会自动提示用户许可; 或者,您可以调用requestRecordPermission:在您选择的时间提示用户


mri*_*011 12

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
    }
Run Code Online (Sandbox Code Playgroud)


小智 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
}
Run Code Online (Sandbox Code Playgroud)


sou*_*cse 5

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

并包括 <AVFoundation/AVAudioSession.h>


itM*_*nce 5

我经常最终快速检查使用音频记录的对象:

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