如何在iOS上检测用户是否授予麦克风权限?

6

事情是这样的,当用户允许或拒绝使用麦克风后,我需要调用一些函数。

我已经看到了以下内容:

[[AVAudioSession sharedInstance] requestRecordPermission:^(BOOL granted) {
        if (granted) {
            // Microphone enabled code
            [self someFunction];

        }
        else {
            // Microphone disabled code
        }
 }];

然而,这只能检测当前状态。 如果当前状态是“否”,并且弹出窗口显示,并且用户授予权限-该函数将不会被调用。这是因为在执行此操作时权限为“否”,并且在下一次运行代码之前,该函数将不会被调用。 我想要做的是在用户按下“允许”或“拒绝”后调用一个函数。 有人知道如何做到这一点吗? 编辑: 忘记提到它必须是iOS 7.0向上兼容的解决方案。

1
我认为你无法检测自动记录权限的选择,但是你可以创建一个定时器,每隔1秒钟检查应用程序是否具有权限,如果有,定时器停止,应用程序按预期进行。 - vaid
2个回答

12
在iOS 8中引入了一种名为AVAudioSession的方法,名为recordPermission。它返回一个名为AVAudioSessionRecordPermission的枚举类型。您可以使用switch语句来确定是否向用户呈现了权限警报。这样,当用户第一次允许或拒绝权限时,您只需调用requestRecordPermission一次,以便权限块可以假定在用户首次允许或拒绝权限后执行。
例如:
AVAudioSessionRecordPermission permissionStatus = [[AVAudioSession sharedInstance] recordPermission];

switch (permissionStatus) {
     case AVAudioSessionRecordPermissionUndetermined:{
          [[AVAudioSession sharedInstance] requestRecordPermission:^(BOOL granted) {
          // CALL YOUR METHOD HERE - as this assumes being called only once from user interacting with permission alert!
              if (granted) {
                  // Microphone enabled code
              }
              else {
                  // Microphone disabled code
              }
           }];
          break;
          }
     case AVAudioSessionRecordPermissionDenied:
          // direct to settings...
          break;
     case AVAudioSessionRecordPermissionGranted:
          // mic access ok...
          break;
     default:
          // this should not happen.. maybe throw an exception.
          break;
}

这看起来是一个好答案,但我忘了提到我需要 iOS 7.0 及以上兼容的解决方案。我会为您的努力点赞。 - veich
1
我明白了...由于权限警告只会向用户显示一次,因此您可以考虑在调用requestRecordPermission后写入某种标志到NSUserDefaults中。但在调用之前检查该标志是否存在,如果不存在,则说明它是第一次被调用,因此您可以在权限块中做出类似于我的答案的假设。 - Bamsworld

0
如果用户尚未授权,请执行以下操作:
  1. 首先,显示弹出对话框
  2. 在OP中运行您的代码

-

if([[AVAudioSession sharedInstance] respondsToSelector:@selector(requestRecordPermission)]) {
    [[AVAudioSession sharedInstance] requestRecordPermission];
    // Now run your function
}

1
我认为OP的意思是他/她想要捕获iOS在您尝试访问麦克风时弹出的自动记录请求。 - vaid
我不知道OP是什么,也不知道这段代码应该从哪里执行。尝试添加它,代码立即执行,因此无法捕获用户的响应。 - veich
1
OP 意味着“原帖发布者”。代码可以插入到方法中。当调用该方法时,此代码将被执行。 - vaid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接