【问题标题】:iOS check if application has access to microphoneiOS 检查应用程序是否可以访问麦克风
【发布时间】:2014-09-18 19:40:06
【问题描述】:

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

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

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

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

【问题讨论】:

标签: ios objective-c swift microphone avaudiosession


【解决方案1】:

您可以使用recordPermission() 进行检查,它从 iOS 8 开始就可用。

请记住,从 iOS 10 开始,您必须在您的 info.plist 中设置 NSMicrophoneUsageDescription 属性以获得麦克风权限,并为用户添加一条消息。此消息在请求时显示给用户。最后,如果要本地化您的应用,请务必包含您的 plist 字符串以进行翻译。

如果不这样做会导致在尝试访问麦克风时崩溃。

此答案已针对 Swift 5.x

再次清理
import AVFoundation

    switch AVAudioSession.sharedInstance().recordPermission {
    case .granted:
        print("Permission granted")
    case .denied:
        print("Permission denied")
    case .undetermined:
        print("Request permission here")
        AVAudioSession.sharedInstance().requestRecordPermission({ granted in
            // Handle granted
        })
    @unknown default:
        print("Unknown case")
    }

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

【讨论】:

  • 仅供参考,添加到 info.plist 的属性是 NSMicrophoneUsageDescription
  • @Harris 谢谢,我的截图截取了它,但我会让它更明确
【解决方案2】:

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: 来 在您选择的时间提示用户

【讨论】:

    【解决方案3】:

    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
        }
    

    【讨论】:

    • 这将不起作用,因为 requestRecordPermission 被异步调用。总会有true返回
    • 你可以在objective-c中使用信号量,或者在Swift中使用DispatchGroup,这种情况下你可以等待结果,然后返回。
    【解决方案4】:

    还有另一种方法可以尝试以下适用于 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>

      【讨论】:

      • 我不想请求录音权限,我只想检查应用程序是否可以访问麦克风(例如位置访问:[CLLocationManager authorizationStatus]
      • 第一次请求,下次以后不再请求
      • 所以我可以在 iOS 8 中检查麦克风访问权限?
      • 我试过了,但它说在对象类型 avaudiosession 上找不到属性 requestrecordpermission
      • 你能分享一个虚拟项目吗?
      【解决方案6】:

      由于此处的其他答案都没有提到这一点,因此您需要将权限添加到您的 info.plist。具体来说,添加一个条目:

      隐私 - 麦克风使用说明

      对于字符串值,输入如下内容: (应用名称)需要访问您的麦克风。

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

      【讨论】:

        【解决方案7】:

        导入 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
                }
        

        【讨论】:

          【解决方案8】:

          为了快速检查使用音频记录的对象,我经常会做些什么:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-03-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-02-24
            相关资源
            最近更新 更多