2013-09-05 6 views
37

Vorrei rilevare quando un utente ha rifiutato l'autorizzazione del microfono sulla mia applicazione iOS. Ricevo questo valore solo quando provo a registrare il microfono: -120,000000 dbCome rilevare l'autorizzazione di input del microfono rifiutata in iOS 7

Ma prima di ottenere questo, devo configurare una sessione audio AVA. C'è un'altra funzione?

E ho ricevuto questo messaggio nell'output: Microphone input permission refused - will record only silence

Grazie.

risposta

1

Non sono sicuro al 100% se possiamo parlare di iOS 7 al di fuori dei sistemi di sviluppo Apple, but I found the answer you're looking for there.

In breve, troverai la soluzione nel file di intestazione AVAudioSession.h nell'SDK. E se vuoi sfruttarlo pur continuando a supportare iOS 6, assicurati di utilizzare "respondsToSelector:" per verificare la disponibilità dell'API.

42

Si prega di notare che questo funziona solo se costruito con Xcode 5, e non con 4,6

Aggiungere il quadro AVFoundation al progetto

quindi importare il file di intestazione AVAudioSession, dal quadro AVFoundation, dove intenda controllare se l'impostazione del microfono è attivata

#import <AVFoundation/AVAudioSession.h> 

Poi semplicemente chiamare questo metodo

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

La prima volta che viene eseguito questo metodo, verrà visualizzato il prompt per consentire l'accesso al microfono e in base alla risposta degli utenti eseguirà il blocco di completamento. A partire dalla seconda volta, agirà in base all'impostazione memorizzata sul dispositivo.

+1

Nota che questo metodo è disponibile solo su iOS7 e superiori. https://developer.apple.com/library/ios/documentation/AVFoundation/Reference/AVAudioSession_ClassReference/Reference/Reference.html # // apple_ref/occ/instm/AVAudioSession/requestRecordPermission: –

51

Se si sta ancora eseguendo la compilazione con iOS SDK 6.0 (come me), è necessario essere un po 'più indiretti di @Luis E. Prado, poiché il metodo requestRecordPermission non esiste.

Ecco come l'ho fatto. Rimuovi il bit di autorelease se stai usando ARC. Su iOS6 non succede nulla, e su iOS7 viene registrato il messaggio "microfono abilitato" o viene visualizzato l'avviso.

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: Si scopre che il blocco withObject viene eseguito in un thread in background, in modo da non fare qualsiasi lavoro interfaccia utente in là, o la vostra applicazione potrebbe bloccarsi. Ho modificato il codice sopra. Un cliente ha sottolineato ciò che era fortunatamente una versione beta. Ci scusiamo per l'errore.

+0

Ho riscontrato un problema con questa soluzione su iPad Air (solo). Sai se esiste qualche configurazione aggiuntiva con questo tipo di dispositivo? – Beto

+0

@BetoBens Non ho sentito nulla di specifico per quel modello. Qual è il problema? –

+0

Quando registro su un file utilizzando il microfono incorporato nell'iPad Air, il file viene creato ma durante la riproduzione non si sente alcun suono e la riproduzione non si interrompe e si verifica solo con questo dispositivo. È così strano. – Beto

1

risposta Swift:

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

oppure è possibile utilizzare framework come PermissionScope che permettono di controllare facilmente i permessi. https://github.com/nickoneill/PermissionScope

Edit: Swift 3 risposta:

import AVFoundation 
... 
if AVAudioSession.sharedInstance().recordPermission() == .denied { 
    print("Microphone permission refused"); 
} 
Problemi correlati