23

我正在使用新的 iOS7 开发人员 SDK,现在用户的应用程序请求他允许在应用程序第一次尝试录制时从麦克风录制。 在此处输入图像描述

我的应用程序会在倒计时后记录,所以用户看不到这个请求。我使用此代码检查requestRecordPermission

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

但是在我开始录制之前,我怎样才能自己触发请求呢?

4

6 回答 6

27

在新的 iOS7 中很简单,试试这个:

if([[AVAudioSession sharedInstance] respondsToSelector:@selector(requestRecordPermission)])
{
    [[AVAudioSession sharedInstance] requestRecordPermission];
}
于 2013-06-13T07:43:46.310 回答
12

这是对我有用的最终代码片段。它支持 Xcode 4 和 5,适用于 iOS5+。

#ifndef __IPHONE_7_0
    typedef void (^PermissionBlock)(BOOL granted);
#endif

    PermissionBlock permissionBlock = ^(BOOL granted) {
        if (granted)
        {
            [self doActualRecording];
        }
        else
        {
            // Warn no access to microphone
        }
    };

    // iOS7+
    if([[AVAudioSession sharedInstance] respondsToSelector:@selector(requestRecordPermission:)])
    {
        [[AVAudioSession sharedInstance] performSelector:@selector(requestRecordPermission:)
                                              withObject:permissionBlock];
    }
    else
    {
        [self doActualRecording];
    }
于 2013-09-30T14:28:43.517 回答
7

正如“One Man Crew”所说,您可以使用 requestRecordPermission。

需要注意的重要一点是,您必须检查 requestRecordPermission 是否已实现。原因是如果您的应用程序将在较旧的 iOS 版本(例如 iOS 6.x)上运行,它会在此调用后崩溃。为防止这种情况发生,您必须检查此选择器是否已实现(无论如何这是一个好习惯)。

代码应该是这样的:

if([[AVAudioSession sharedInstance] respondsToSelector:@selector(requestRecordPermission:)]){
    [[AVAudioSession sharedInstance] requestRecordPermission];
}

使用这种方法,您的应用程序将支持新操作系统以及以前版本的操作系统。

每次 Apple 向新操作系统添加更多功能时,我都会使用这种方法(这样我就可以很容易地支持旧版本)。

于 2013-06-13T19:34:14.597 回答
3
    AVAudioSession.sharedInstance().requestRecordPermission({ (granted) -> Void in
        if !granted
        {
            let microphoneAccessAlert = UIAlertController(title: NSLocalizedString("recording_mic_access",comment:""), message: NSLocalizedString("recording_mic_access_message",comment:""), preferredStyle: UIAlertControllerStyle.Alert)

            var okAction = UIAlertAction(title: NSLocalizedString("OK",comment:""), style: UIAlertActionStyle.Default, handler: { (alert: UIAlertAction!) -> Void in
                UIApplication.sharedApplication().openURL(NSURL(string: UIApplicationOpenSettingsURLString)!)
            })


            var cancelAction = UIAlertAction(title: NSLocalizedString("Cancel",comment:""), style: UIAlertActionStyle.Cancel, handler: { (alert: UIAlertAction!) -> Void in

            })
            microphoneAccessAlert.addAction(okAction)
            microphoneAccessAlert.addAction(cancelAction)
            self.presentViewController(microphoneAccessAlert, animated: true, completion: nil)
            return
        }
        self.performSegueWithIdentifier("segueNewRecording", sender: nil)
    });
于 2015-07-22T23:42:40.917 回答
2

基于https://stackoverflow.com/users/1071887/idan的回复。

AVAudioSession *session = [AVAudioSession sharedInstance];

// AZ DEBUG @@ iOS 7+
AVAudioSessionRecordPermission sessionRecordPermission = [session recordPermission];
switch (sessionRecordPermission) {
    case AVAudioSessionRecordPermissionUndetermined:
        NSLog(@"Mic permission indeterminate. Call method for indeterminate stuff.");
        break;
    case AVAudioSessionRecordPermissionDenied:
        NSLog(@"Mic permission denied. Call method for denied stuff.");
        break;
    case AVAudioSessionRecordPermissionGranted:
        NSLog(@"Mic permission granted.  Call method for granted stuff.");
        break;
    default:
        break;
}
于 2015-11-18T19:32:41.127 回答
0

斯威夫特 4:

let session = AVAudioSession.sharedInstance()
if (session.responds(to: #selector(AVAudioSession.requestRecordPermission(_:)))) {
    AVAudioSession.sharedInstance().requestRecordPermission({(granted: Bool)-> Void in
        if granted {
            print("granted")
        } else {
            print("not granted")
        }
    })
}
于 2020-01-26T17:00:47.903 回答