2013-06-13 6 views
18

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

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

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

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

+0

@OneManCrew Вопрос, похоже, не проявляет никаких усилий для решения проблемы самостоятельно, и в основном он просит учебник. (Из-за этого «слишком широкий» по-разному) –

ответ

26

В новом iOS7 это очень просто попробовать это:

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

Спасибо !!! это работает! – user2068793

+6

На самом деле в iOS7 эта функция требует использования с блоками, которые можно вызвать следующим образом: [[AVAudioSession sharedInstance] requestRecordPermission:^(BOOL response) { NSLog (@ «Разрешить использование ответа микрофона:% d», ответ); }]; – c0d3Junk13

+0

Также вам может понадобиться #ifdef __IPHONE_7_0 вокруг вышеуказанного кода #endif, чтобы скомпилировать его в старых версиях xcode. – c0d3Junk13

6

В "One Man Crew" утверждал, вы можете использовать requestRecordPermission.

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

Кодекс должен быть чем-то вроде этого:

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

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

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

+0

Это тривиально! Кстати, если вы используете этот метод на более ранних версиях iOS, метод ничего не сделает, потому что метод является частью ios7 sdk. –

+1

Не рекомендуется использовать этот метод с предыдущими SDK, потому что вы не будете компилировать iOS 7, и вы не имеете к этому никакого отношения. Но если вы используете новые SDK и целевые старые устройства (например, iOS 6.x), если вы не будете использовать эту проверку, ваше приложение обязательно сработает!Поэтому, пожалуйста, обратите внимание, чтобы использовать эту супер важную проверку. Это происходит каждый раз, когда Apple добавляет новую функцию. Если это было другим способом (функция удаления Apple), ваше приложение не будет разбиваться, и вы просто получите предупреждение о том, что функция устарела (без сбоев). – Idan

+0

Вы очень ошибаетесь! Прямой связи между пакетом SDK, с которым было создано приложение и операционная система, установленная на устройстве, не существует. Вы можете создавать полные приложения с SDK IOS7 и работать на более старой ОС. !! – user2068793

10

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

На основании ответа https://stackoverflow.com/users/1071887/idan «s.

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