39

我想检测用户何时拒绝我的 iOS 应用程序的麦克风权限。当我尝试录制麦克风时,我只得到这个值:-120.000000 db

但在得到这个之前,我必须设置一个 AVAudioSession。还有其他功能吗?

我在输出中收到了这条消息: Microphone input permission refused - will record only silence

谢谢。

4

4 回答 4

51

如果您仍在使用 iOS SDK 6.0 进行编译(就像我一样),您必须比@Luis E. Prado 更间接一些,因为 requestRecordPermission 方法不存在。

这就是我的做法。如果您使用 ARC,请删除自动释放位。在 iOS6 上没有任何反应,在 iOS7 上,要么记录“麦克风已启用”消息,要么弹出警报。

AVAudioSession *session = [AVAudioSession sharedInstance];
if ([session respondsToSelector:@selector(requestRecordPermission:)]) {
    [session performSelector:@selector(requestRecordPermission:) withObject:^(BOOL granted) {
        if (granted) {
            // Microphone enabled code
            NSLog(@"Microphone is enabled..");
        }
        else {
            // Microphone disabled code
            NSLog(@"Microphone is disabled..");

            // We're in a background thread here, so jump to main thread to do UI work.
            dispatch_async(dispatch_get_main_queue(), ^{
                [[[[UIAlertView alloc] initWithTitle:@"Microphone Access Denied"
                                        message:@"This app requires access to your device's Microphone.\n\nPlease enable Microphone access for this app in Settings / Privacy / Microphone"
                                       delegate:nil
                              cancelButtonTitle:@"Dismiss"
                              otherButtonTitles:nil] autorelease] show];
            });
        }
    }];
}

编辑:事实证明 withObject 块是在后台线程中执行的,所以不要在那里做任何 UI 工作,否则你的应用程序可能会挂起。我已经调整了上面的代码。一位客户在值得庆幸的是测试版中指出了这一点。为错误道歉。

于 2013-09-30T09:11:27.857 回答
42

请注意,这仅适用于使用 Xcode 5 而不是 4.6 构建的

将 AVFoundation 框架添加到您的项目中

然后从 AVFoundation 框架中导入 AVAudioSession 头文件,您打算在其中检查麦克风设置是否启用

#import <AVFoundation/AVAudioSession.h>

然后简单地调用这个方法

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

此方法第一次运行时,将显示允许麦克风访问的提示,并根据用户的响应执行完成块。从第二次开始,它将仅根据设备上存储的设置进行操作。

于 2013-09-17T01:20:21.227 回答
3

快速回答:

if AVAudioSession.sharedInstance().recordPermission() == .Denied {
    print("Microphone permission refused");
}

或者您可以使用 PermissionScope 之类的框架来轻松检查权限。https://github.com/nickoneill/PermissionScope

编辑:斯威夫特 3 答案:

import AVFoundation
...
if AVAudioSession.sharedInstance().recordPermission() == .denied {
    print("Microphone permission refused");
}
于 2016-08-31T12:49:47.423 回答
0

我不能 100% 确定我们是否被允许在 Apple 的开发论坛之外谈论 iOS 7,但我在那里找到了您正在寻找的答案

简而言之,您将在 SDK 的 AVAudioSession.h 头文件中找到您的解决方案。如果您想在仍然支持 iOS 6 的同时使用它,请务必使用 " respondsToSelector:" 检查 API 可用性。

于 2013-09-05T00:19:37.563 回答