【问题标题】:How to detect user giving microphone permission on iOS?如何检测用户在 iOS 上授予麦克风权限?
【发布时间】:2016-01-08 23:44:33
【问题描述】:

所以问题是我需要在用户授予(或拒绝)使用麦克风的权限后调用某些函数。

我已经看到了:

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

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

但是,这仅适用于检测当前状态。

如果当前状态为“否”并且弹出窗口显示并且用户授予权限 - 该函数将不会被调用。那是因为在执行此操作的那一刻,权限为“否”,直到我们下次运行代码,该函数才会被调用。

我想做的是在用户按下“允许”或“拒绝”后调用一个函数。

有人知道怎么做吗?

编辑: 忘了说它必须是 iOS 7.0 up 兼容的解决方案。

【问题讨论】:

  • 我认为您无法检测到自动记录权限的选择,但是,您可以创建一个计时器,每隔 1 秒左右检查一次应用程序是否具有权限,如果有,计时器停止,应用程序按预期工作。

标签: ios objective-c permissions microphone


【解决方案1】:

如果使用尚未获得您的许可,请执行以下操作:

  1. 首先,显示弹出对话框
  2. 在 OP 中运行代码

-

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

【讨论】:

  • 我认为OP的意思是他/她想捕捉iOS在你尝试访问麦克风时为你弹出的自动录音请求。
  • 我不知道 OP 是什么,也不知道应该从哪里执行此代码。尝试添加它并且代码立即执行,因此无法捕获用户的响应
  • OP 的意思是“原创海报”。代码可以插入到方法中。调用该方法时,将执行此代码。
【解决方案2】:

iOS 8 中引入的AVAudioSession 方法是recordPermission。这将返回一个名为 AVAudioSessionRecordPermission 的枚举。您可以使用开关来确定权限警报是否已呈现给用户。这样,您只有在 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 兼容的解决方案。我会投票支持这项工作的解决方案。
  • 我明白了...因为权限警报只显示给用户一次,可能考虑在调用 requestRecordPermission 后向 NSUserDefaults 写入某种标志。但是在调用之前检查标志,如果它不存在,那么你会知道它是第一次被调用,因此你可以在权限块中做出类似的假设作为我的答案。
猜你喜欢
  • 1970-01-01
  • 2021-06-11
  • 2020-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-18
  • 2011-09-05
相关资源
最近更新 更多