2013-09-05 3 views
37

Я хотел бы узнать, когда пользователь отказался от разрешения микрофона на моем приложении iOS. Я получаю это значение только при попытке записать микрофон: -120.000000 dbКак определить разрешение на вход микрофона в iOS 7

Но прежде чем это сделать, мне нужно настроить AVAudioSession. Есть ли еще одна функция?

И я получил это сообщение на выходе: Microphone input permission refused - will record only silence

Спасибо.

ответ

1

Я не уверен на 100%, если нам разрешено говорить о iOS 7 вне devforums от Apple, but I found the answer you're looking for there.

Одним словом, вы найдете свое решение в файле заголовка AVAudioSession.h в SDK. И если вы хотите использовать его при поддержке iOS 6, обязательно используйте «respondsToSelector:», чтобы проверить наличие API.

42

Пожалуйста, обратите внимание, что это будет работать только тогда, когда построен с Xcode 5, а не 4,6

Добавьте AVFoundation Framework для вашего проекта

Затем импортировать файл заголовка AVAudioSession, из рамок AVFoundation, где вы намерены проверить, если настройка микрофона включена

#import <AVFoundation/AVAudioSession.h> 

Тогда просто вызовите этот метод

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

В первый раз, когда этот метод запускается, он отобразит приглашение, чтобы разрешить доступ к микрофону, и на основе ответа пользователя он выполнит блок завершения. Со второго раза он будет действовать только на основе сохраненной настройки на устройстве.

+1

Обратите внимание, что этот метод доступен только на iOS7 и выше. https://developer.apple.com/library/ios/documentation/AVFoundation/Reference/AVAudioSession_ClassReference/Reference/Reference.html # // apple_ref/occ/instm/AVAudioSession/requestRecordPermission: –

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

EDIT: Получается, что блок withObject выполняется в фоновом потоке, так что не делать любую работу пользовательского интерфейса там, или ваше приложение может зависнуть. Я скорректировал код выше. Клиент указал на то, что было к счастью бета-версией. Извиняюсь за ошибку.

+0

У меня проблема с этим решением на iPad Air (только). Знаете ли вы, существует ли какая-то дополнительная конфигурация с этим устройством? – Beto

+0

@BetoBens Я ничего не слышал о конкретной модели. В чем проблема? –

+0

Когда я записываю файл с помощью встроенного микрофона в iPad Air, файл создается, но когда я воспроизвожу звук, звук не слышен, и воспроизведение никогда не останавливается и происходит только с этим устройством. Это так странно. – Beto

1

Swift Ответ:

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

Или вы можете использовать рамки как PermissionScope, которые позволяют легко проверить разрешения. https://github.com/nickoneill/PermissionScope

Edit: Swift 3 Ответ:

import AVFoundation 
... 
if AVAudioSession.sharedInstance().recordPermission() == .denied { 
    print("Microphone permission refused"); 
} 
Смежные вопросы