2013-06-13 16 views
18

Używam nowego SDK dla programistów iOS7, a teraz wniosek aplikacji od użytkownika, jego pozwolenie na nagrywanie z mikrofonu, gdy aplikacja próbuje nagrać pierwszy raz. enter image description hereJak mogę zażądać zgody na rejestrację mikrofonu od użytkownika

Moja aplikacja będzie rejestrować po odliczeniu, więc użytkownik nie może zobaczyć tego żądania. używam tego kodu, aby sprawdzić requestRecordPermission:

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

Ale w jaki sposób można wywołać żądania przez siebie zanim zacznę nagrywać?

+0

@OneManCrew Pytanie wydaje się nie wykazują żadnego wysiłku w kierunku rozwiązania problemu sami, i to w zasadzie jest prośbą o kursie. (Stąd "zbyt szeroki" z bliskiej przyczyny) –

Odpowiedz

26

W nowym iOS7 to bardzo proste spróbuj tego:

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

Dzięki! to jest praca! – user2068793

+6

Aktualnie w iOS7 ta funkcja wymaga użycia bloków, które można nazwać tak: [[AVAudioSession sharedInstance] requestRecordPermission:^(Odpowiedź BOOL) { NSLog (@ "Zezwalaj na użycie mikrofonu:% d", odpowiedź); }]; – c0d3Junk13

+0

Również możesz potrzebować #ifdef __IPHONE_7_0 wokół powyższego kodu #endif, aby skompilować go w starszych wersjach xcode. – c0d3Junk13

6

Jako "One Man Załoga" twierdził, można użyć requestRecordPermission.

Ważną rzeczą, o której należy pamiętać, jest to, że musisz musi sprawdzić, czy requestRecordPermission jest zaimplementowany. Powodem jest to, że gdyby Twoja aplikacja działała na starszą wersję iOS (na przykład iOS 6.x), to zawiesiłaby się po tym połączeniu. Aby temu zapobiec, należy sprawdzić, czy ten selektor jest zaimplementowany (mimo to jest to dobra praktyka).

Kodeks powinien być mniej więcej tak:

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

Stosując tę ​​metodę aplikacja będzie wspierać nowy system operacyjny i również poprzednie wersje systemu operacyjnego.

Używam tej metody za każdym razem, gdy Apple dodaje więcej funkcjonalności do nowego systemu operacyjnego (w ten sposób mogę w prosty sposób obsługiwać starsze wersje).

+0

To banalne! Przy okazji, jeśli użyjesz tej metody na wcześniejszych wersjach iOS, metoda nic nie zrobi, ponieważ metoda jest częścią pakietu ios7 sdk. –

+1

Stosowanie tej metody z poprzednimi pakietami SDK nie jest uzasadnione, ponieważ nie będzie można kompilować do systemu iOS 7 i nie ma to z tym nic wspólnego. Jeśli jednak używasz nowego zestawu SDK i kierujesz go na starsze urządzenia (na przykład iOS 6.x), jeśli nie skorzystasz z tej funkcji, aplikacja zdecydowanie się zawiesi!Tak więc, proszę zwrócić uwagę, aby użyć tej bardzo ważnej kontroli. Zdarza się za każdym razem, gdy Apple dodaje nową funkcję. Jeśli byłaby to inna metoda (funkcja usuwania Apple), aplikacja nie ulegnie awarii i pojawi się ostrzeżenie, że funkcja jest przestarzała (brak awarii). – Idan

+0

Bardzo się mylisz! Nie ma bezpośredniego połączenia między pakietem SDK, z którym została zbudowana aplikacja a systemem operacyjnym zainstalowanym na urządzeniu. Możesz budować kompletne aplikacje z SDK IOS7 i będzie działać na starszym systemie. !! – user2068793

10

Oto ostateczny fragment kodu, który działa dla mnie. Obsługuje zarówno Xcode 4 i 5, i działa na 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

podstawie odpowiedzi 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; 
} 
Powiązane problemy