web-dev-qa-db-fra.com

Comment demander l'autorisation d'enregistrement de micro à l'utilisateur

J'utilise le nouveau SDK développeur iOS7 et maintenant la demande d'application de l'utilisateur sa permission d'enregistrer à partir du micro lorsque l'application essaie d'enregistrer pour la première fois. enter image description here

Mon application enregistrera après un compte à rebours, afin que l'utilisateur ne puisse pas voir cette demande. J'utilise ce code pour vérifier le requestRecordPermission:

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

Mais comment puis-je déclencher la demande moi-même avant de commencer à enregistrer?

22
user2110287

Dans le nouvel iOS7, c'est très simple, essayez ceci:

if([[AVAudioSession sharedInstance] respondsToSelector:@selector(requestRecordPermission)])
{
    [[AVAudioSession sharedInstance] requestRecordPermission];
}
27
One Man Crew

Voici l'extrait de code final qui fonctionne pour moi. Il prend en charge Xcode 4 et 5 et fonctionne pour 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];
    }
11
Alex Bogomolov

Comme l'a affirmé "One Man Crew", vous pouvez utiliser requestRecordPermission.

Une chose importante à savoir est que vous devez vérifier que requestRecordPermission est implémenté. La raison en est que si votre application s'exécutait sur une ancienne version iOS (iOS 6.x par exemple), elle se bloquerait après cet appel. Pour éviter cela, vous devez vérifier que ce sélecteur est implémenté (c'est une bonne pratique de toute façon).

Le code devrait ressembler à ceci:

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

En utilisant cette méthode, votre application prend en charge le nouveau système d'exploitation ainsi que les versions précédentes du système d'exploitation.

J'utilise cette méthode à chaque fois Apple ajoute plus de fonctionnalités au nouveau système d'exploitation (de cette façon, je peux prendre en charge les anciennes versions assez facilement).

7
Idan
    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)
    });
3
Ilker Baltaci

Basé sur la réponse de https://stackoverflow.com/users/1071887/idan .

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;
}
2
Alex Zavatone