2013-09-05 12 views
37

chciałbym wykryć, kiedy użytkownik odmówił zgody mikrofonu na mojej aplikacji iOS. Otrzymuję tę wartość tylko wtedy, gdy próbuję nagrać mikrofon: -120.000000 dbJak wykryć pozwolenie wejścia mikrofonowego odmówił w iOS 7

Ale zanim to zrobię, muszę ustawić AVAudioSession. Czy istnieje inna funkcja?

I mam ten komunikat na wyjściu: Microphone input permission refused - will record only silence

Dzięki.

Odpowiedz

1

nie jestem 100% pewien, czy mamy prawo mówić o iOS 7 zewnątrz devforums Apple, but I found the answer you're looking for there.

W skrócie, można znaleźć rozwiązanie w pliku nagłówkowym AVAudioSession.h w SDK. A jeśli chcesz wykorzystać go podczas iOS nadal wspierających 6, upewnij się, aby użyć „respondsToSelector:” aby sprawdzić dostępność API.

42

Należy pamiętać, że to będzie działać tylko wtedy, zbudowany z Xcode 5, a nie 4,6

Dodaj Framework AVFoundation do projektu

następnie zaimportować plik nagłówka AVAudioSession, z ram AVFoundation, gdzie zamierzają sprawdzić, czy ustawienie mikrofonu jest włączona

#import <AVFoundation/AVAudioSession.h> 

Następnie wystarczy wywołać tę metodę

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

Po uruchomieniu tej metody po raz pierwszy pojawi się monit o zezwolenie na dostęp do mikrofonu i na podstawie odpowiedzi użytkownika wykona on blok kończący. Po raz drugi będzie działał w oparciu o zapisane ustawienia na urządzeniu.

+1

Należy zauważyć, że metoda ta jest dostępna tylko w iOS7 i powyżej. https://developer.apple.com/library/ios/documentation/AVFoundation/Reference/AVAudioSession_ClassReference/Reference/Reference.html # // apple_ref/occ/instm/AVAudioSession/requestRecordPermission: –

51

Jeśli nadal kompilujesz z iOS SDK 6.0 (tak jak ja), musisz być nieco bardziej pośredni niż @Luis E. Prado, ponieważ metoda requestRecordPermission nie istnieje.

Oto jak to zrobiłem. Usuń bit Autorelease, jeśli używasz ARC. W systemie iOS6 nic się nie dzieje, aw systemie iOS7 jest zalogowany komunikat "mikrofon jest włączony" lub pojawia się alert.

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: Okazuje się, że blok withObject jest wykonywany w wątku tła, więc nie wykonywać żadnej pracy UI tam, czy aplikacja może się zawiesić. Poprawiłem powyższy kod. Klient wskazał na to, co było na szczęście wersją beta. Przepraszam za błąd.

+0

Mam problem z tym rozwiązaniem na iPadzie Air (tylko). Czy wiesz, czy istnieje jakaś dodatkowa konfiguracja z tego rodzaju urządzeniem? – Beto

+0

@BetoBens Nie słyszałem o niczym konkretnym dla tego modelu. Jaki jest problem? –

+0

Kiedy nagrywam do pliku za pomocą wbudowanego mikrofonu w iPadzie Air, plik jest tworzony, ale kiedy go odtwarzam, nie słychać dźwięku, a odtwarzanie nigdy się nie zatrzymuje i dzieje się tylko z tym urządzeniem. To takie dziwne. – Beto

1

odpowiedź Swift:

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

Albo można użyć ramy jak PermissionScope który umożliwić łatwe sprawdzenie uprawnień. https://github.com/nickoneill/PermissionScope

Edit: Swift 3 odpowiedź:

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