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

问题描述 投票:26回答:8

随着iOS 7的引入,应用程序要录制音频时必须请求麦克风访问权限。

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

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

if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusDenied) {
    // Do something
}
ios objective-c swift microphone avaudiosession
8个回答
28
投票

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字符串。

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
}

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
}

63
投票

您可以使用recordPermission()进行检查,此功能自iOS 8起可用。


13
投票

Swift 3完整解决方案代码


9
投票

还有另一种方法可以尝试针对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
}

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

并包括<AVFoundation/AVAudioSession.h>


3
投票

由于此处没有其他答案提及此问题,因此您需要将权限添加到info.plist。具体来说,为以下项添加一个条目:

隐私-麦克风使用说明


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
        }

0
投票

我经常经常做的事情是快速检查使用音频记录的对象:

// swift 5 
static public func isAuthorized() -> Bool {
    return AVCaptureDevice.authorizationStatus(for: .audio) == .authorized
}
© www.soinside.com 2019 - 2024. All rights reserved.