私は新しいiOS7開発者SDKを使用しており、アプリが初めて録音しようとしたときに、マイクから録音する許可をユーザーから要求しています。
私のアプリはカウントダウン後に記録するので、ユーザーはこのリクエストを見ることができません。このコードを使用して、requestRecordPermission
を確認します。
[[AVAudioSession sharedInstance] requestRecordPermission:^(BOOL granted) {
if (granted) {
// Microphone enabled code
}
else {
// Microphone disabled code
}
}];
しかし、記録を開始する前に自分でリクエストをトリガーするにはどうすればよいですか?
新しいiOS7では、これを試すのは非常に簡単です。
if([[AVAudioSession sharedInstance] respondsToSelector:@selector(requestRecordPermission)])
{
[[AVAudioSession sharedInstance] requestRecordPermission];
}
これが最終的なコードスニペットです。 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];
}
「One Man Crew」が主張したように、requestRecordPermissionを使用できます。
注意すべき重要なことは、must requestRecordPermissionが実装されていることを確認することです。その理由は、アプリが古いiOSバージョン(iOS 6.xなど)で実行されると、この呼び出し後にクラッシュするためです。これを防ぐには、このセレクターが実装されていることを確認する必要があります(これはいずれにしても良い方法です)。
コードは次のようになります。
if([[AVAudioSession sharedInstance] respondsToSelector:@selector(requestRecordPermission:)]){
[[AVAudioSession sharedInstance] requestRecordPermission];
}
この方法を使用すると、アプリは新しいOSと以前のバージョンのOSをサポートします。
私は毎回このメソッドを使用していますApple新しいOSに機能を追加します(この方法で古いバージョンをサポートするのはとても簡単です)。
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)
});
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;
}