Как запросить разрешение на запись микрофона у пользователя

Я использую новый SDK разработчика iOS7, и теперь приложение запрашивает у пользователя разрешение на запись с микрофона, когда приложение пытается записать в первый раз. введите здесь описание изображения

Мое приложение будет записывать после обратного отсчета, поэтому пользователь не увидит этот запрос. Я использую этот код для проверки requestRecordPermission:

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

Но как я могу инициировать запрос самостоятельно, прежде чем начать запись?


person Community    schedule 13.06.2013    source источник
comment
@OneManCrew Вопрос, похоже, не показывает каких-либо усилий по решению проблемы самостоятельно, и в основном он требует учебника. (Следовательно, слишком широко в близкой причине)   -  person Andrew Barber    schedule 19.06.2013


Ответы (5)


В новой iOS7 очень просто попробовать следующее:

if([[AVAudioSession sharedInstance] respondsToSelector:@selector(requestRecordPermission)])
{
    [[AVAudioSession sharedInstance] requestRecordPermission];
}
person One Man Crew    schedule 13.06.2013
comment
На самом деле в iOS7 эта функция требует использования с блоками, которые можно вызвать следующим образом: [[AVAudioSession sharedInstance] requestRecordPermission:^(BOOL response){ NSLog(@Разрешить использование микрофона response: %d, response); }]; - person C0D3; 08.08.2013
comment
Также вам может понадобиться #ifdef __IPHONE_7_0 вокруг приведенного выше кода #endif для его компиляции в более старых версиях xcode. - person C0D3; 09.08.2013
comment
Пример приложения PrivacyPrompts от Apple, использующий requestRecordPermission, не работает. Что дает? - person user523234; 21.08.2013
comment
не могли бы вы проверить этот вопрос? stackoverflow.com/questions/18957643/ и предоставить необходимую информацию. Спасибо. - person PK86; 04.10.2013

Вот окончательный фрагмент кода, который работает для меня. Он поддерживает 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];
    }
person Alex Bogomolov    schedule 30.09.2013

Как утверждает «One Man Crew», вы можете использовать requestRecordPermission.

Важно помнить, что вы должны проверить, что requestRecordPermission реализован. Причина в том, что если ваше приложение будет работать на более старой версии iOS (например, iOS 6.x), оно вылетит после этого вызова. Чтобы предотвратить это, вы должны проверить, реализован ли этот селектор (в любом случае это хорошая практика).

Код должен быть примерно таким:

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

Используя этот метод, ваше приложение будет поддерживать новую ОС, а также предыдущие версии ОС.

Я использую этот метод каждый раз, когда Apple добавляет больше функциональности в новую ОС (таким образом я могу довольно легко поддерживать старые версии).

person Idan    schedule 13.06.2013
comment
Это тривиально! Кстати, если вы используете этот метод в более ранних версиях iOS, метод ничего не сделает, потому что метод является частью ios7 sdk. - person One Man Crew; 14.06.2013
comment
Нецелесообразно использовать этот метод с предыдущими SDK, потому что вы не будете компилировать в iOS 7, и вы не имеете к этому никакого отношения. Но если вы используете новый SDK и ориентируетесь на более старые устройства (например, iOS 6.x), если вы не будете использовать эту проверку, ваше приложение обязательно выйдет из строя! Итак, обратите внимание, чтобы использовать эту супер важную проверку. Это происходит каждый раз, когда Apple добавляет новую функцию. Если бы это было иначе (функция удаления Apple), ваше приложение не рухнуло бы, и вы бы просто получили предупреждение о том, что функция устарела (без сбоев). - person Idan; 14.06.2013
comment
Вы очень ошибаетесь! Нет прямой связи между пакетом SDK, с помощью которого было создано приложение, и операционной системой, установленной на устройстве. Вы можете создавать полные приложения с помощью SDK IOS7, и они будут работать на более старых ОС.!! - person ; 18.06.2013
comment
Я думаю, вы меня неправильно поняли. Проще говоря, если вы используете: requestRecordPermission в SDK до 7.x, ваше приложение не будет компилироваться (любой Xcode до Xcode 5). Если вы используете SDK 7.x (Xcode 5.x) и не реализуете проверку ответа, ваше приложение вылетит на любой iOS до 7.x (iOS 5.x или iOS 6.x). Надеюсь, это более понятно Теперь. - person Idan; 18.06.2013
comment
Я попробовал, и у меня не работает проверка на iPhone 4S iOS 6.1, и приложение не вылетает, я думаю, вы ошибаетесь. - person ; 19.06.2013
comment
Этот подход отлично работает от iOS 7+ до iOS 9.x. Я составлю ответ, основанный на этом. - person Alex Zavatone; 18.11.2015

На основе ответа 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;
}
person Alex Zavatone    schedule 18.11.2015

Свифт 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")
        }
    })
}
person Amos    schedule 26.01.2020