web-dev-qa-db-ja.com

ユーザーにマイク録音の許可をリクエストするにはどうすればよいですか

私は新しいiOS7開発者SDKを使用しており、アプリが初めて録音しようとしたときに、マイクから録音する許可をユーザーから要求しています。 enter image description here

私のアプリはカウントダウン後に記録するので、ユーザーはこのリクエストを見ることができません。このコードを使用して、requestRecordPermissionを確認します。

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

しかし、記録を開始する前に自分でリクエストをトリガーするにはどうすればよいですか?

22
user2110287

新しいiOS7では、これを試すのは非常に簡単です。

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

これが最終的なコードスニペットです。 Xcode 4と5の両方をサポートし、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

「One Man Crew」が主張したように、requestRecordPermissionを使用できます。

注意すべき重要なことは、must requestRecordPermissionが実装されていることを確認することです。その理由は、アプリが古いiOSバージョン(iOS 6.xなど)で実行されると、この呼び出し後にクラッシュするためです。これを防ぐには、このセレクターが実装されていることを確認する必要があります(これはいずれにしても良い方法です)。

コードは次のようになります。

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

この方法を使用すると、アプリは新しいOSと以前のバージョンのOSをサポートします。

私は毎回このメソッドを使用していますApple新しいOSに機能を追加します(この方法で古いバージョンをサポートするのはとても簡単です)。

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

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