Benoît Freslon
Benoît Freslon

Reputation: 2021

How to detect microphone input permission refused in iOS 7

I would like to detect when a user refused the microphone permission on my iOS application. I only get this value when I try to record the microphone: -120.000000 db

But before to get this I have to set up an AVAudioSession. Is there another function?

And I got this message in the output: Microphone input permission refused - will record only silence

Thanks.

Upvotes: 39

Views: 23241

Answers (4)

Floris M
Floris M

Reputation: 1814

Swift answer:

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

Or you can use framework like PermissionScope which permit to easily check permissions. https://github.com/nickoneill/PermissionScope

Edit: Swift 3 answer:

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

Upvotes: 3

Ben Clayton
Ben Clayton

Reputation: 82237

If you are still compiling with iOS SDK 6.0 (as I am) you have to be a bit more indirect than @Luis E. Prado, as the requestRecordPermission method doesn't exist.

Here's how I did it. Remove the autorelease bit if you're using ARC. On iOS6 nothing happens, and on iOS7 either the 'microphone is enabled' message is logged or the alert is popped up.

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];
            });
        }
    }];
}

EDIT: It turns out that the withObject block is executed in a background thread, so DO NOT do any UI work in there, or your app may hang. I've adjusted the code above. A client pointed this out on what was thankfully a beta release. Apologies for the mistake.

Upvotes: 51

Luis E. Prado
Luis E. Prado

Reputation: 2151

Please note that this will only work if built with Xcode 5, and not with 4.6

Add the AVFoundation Framework to your project

Then import the AVAudioSession header file, from the AVFoundation framework, where you intend to check if the microphone setting is enabled

#import <AVFoundation/AVAudioSession.h>

Then simply call this method

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

The first time this method runs, it will show the prompt to allow microphone access and based on the users response it will execute the completion block. From the second time onwards it will just act based on the stored setting on the device.

Upvotes: 42

Michael Dautermann
Michael Dautermann

Reputation: 89549

I'm not 100% certain if we're allowed to talk about iOS 7 outside of Apple's devforums, but I found the answer you're looking for there.

In short, you'll find your solution in the AVAudioSession.h header file in the SDK. And if you want to make use of it while still supporting iOS 6, make certain to use "respondsToSelector:" to check for the API availability.

Upvotes: 0

Related Questions