web-dev-qa-db-fra.com

Comment détecter l'autorisation d'entrée de microphone refusée dans iOS 7

Je voudrais détecter lorsqu'un utilisateur a refusé l'autorisation de microphone sur mon application iOS. Je n'obtiens cette valeur que lorsque j'essaie d'enregistrer le microphone: -120,000000 db

Mais avant de l'obtenir, je dois configurer une AVAudioSession. Y a-t-il une autre fonction?

Et j'ai reçu ce message dans la sortie: Microphone input permission refused - will record only silence

Merci.

38
Benoît Freslon

Si vous compilez toujours avec iOS SDK 6.0 (comme moi), vous devez être un peu plus indirect que @Luis E. Prado, car la méthode requestRecordPermission n'existe pas.

Voici comment je l'ai fait. Retirez le bit de libération automatique si vous utilisez ARC. Sur iOS6, rien ne se passe et sur iOS7, le message `` le microphone est activé '' est enregistré ou l'alerte s'affiche.

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 : Il s'avère que le bloc withObject est exécuté dans un thread d'arrière-plan, alors NE faites PAS d'interface utilisateur là-dedans, sinon votre application pourrait se bloquer. J'ai ajusté le code ci-dessus. Un client l'a souligné sur ce qui était heureusement une version bêta. Toutes mes excuses pour l'erreur.

51
Ben Clayton

Veuillez noter que cela ne fonctionnera que s'il est construit avec Xcode 5, et non avec 4.6

Ajoutez le cadre AVFoundation à votre projet

Importez ensuite le fichier d'en-tête AVAudioSession, à partir du framework AVFoundation, où vous avez l'intention de vérifier si le réglage du microphone est activé

#import <AVFoundation/AVAudioSession.h>

Ensuite, appelez simplement cette méthode

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

La première fois que cette méthode s'exécute, elle affichera l'invite pour autoriser l'accès au microphone et, en fonction de la réponse des utilisateurs, elle exécutera le bloc d'achèvement. À partir de la deuxième fois, il agira simplement en fonction des paramètres stockés sur l'appareil.

42
Luis E. Prado

Réponse rapide:

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

Ou vous pouvez utiliser un framework comme PermissionScope qui permet de vérifier facilement les autorisations. https://github.com/nickoneill/PermissionScope

Modifier: Swift 3 réponse:

import AVFoundation
...
if AVAudioSession.sharedInstance().recordPermission() == .denied {
    print("Microphone permission refused");
}
3
Floris M

Je ne suis pas certain à 100% si nous sommes autorisés à parler d'iOS 7 en dehors des forums d'Apple, mais j'ai trouvé la réponse que vous cherchez là-bas .

En bref, vous trouverez votre solution dans le fichier d'en-tête AVAudioSession.h du SDK. Et si vous souhaitez l'utiliser tout en prenant en charge iOS 6, assurez-vous d'utiliser "respondsToSelector: "pour vérifier la disponibilité de l'API.

1
Michael Dautermann