web-dev-qa-db-ja.com

iOS 7で拒否されたマイク入力許可を検出する方法

ユーザーがiOSアプリケーションでマイクの許可を拒否したことを検出したいと思います。マイクを録音しようとしたときにのみ、この値を取得します:-120.000000 db

しかし、これを取得する前に、AVAudioSessionをセットアップする必要があります。別の機能はありますか?

出力に次のメッセージが表示されました:Microphone input permission refused - will record only silence

ありがとう。

38
Benoît Freslon

IOS SDK 6.0(私と同じ)でコンパイルしている場合、requestRecordPermissionメソッドが存在しないため、@ Luis E. Pradoよりももう少し間接的でなければなりません。

ここに私がそれをした方法があります。 ARCを使用している場合は、自動解放ビットを削除してください。 iOS6では何も起こりません。iOS7では、「マイクが有効です」というメッセージが記録されるか、アラートがポップアップされます。

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 [〜#〜]:withObjectブロックはバックグラウンドスレッドで実行されるため、UIでの作業を行わないでください。アプリがハングする可能性があります。上記のコードを調整しました。あるクライアントがありがたいことにベータリリースであったことについてこれを指摘しました。間違いをおologiesびします。

51
Ben Clayton

これはXcode 5でビルドされた場合にのみ機能し、4.6ではビルドされないことに注意してください。

プロジェクトにAVFoundation Frameworkを追加します

次に、AVFoundationフレームワークからAVAudioSessionヘッダーファイルをインポートします。ここで、マイク設定が有効になっているかどうかを確認します。

#import <AVFoundation/AVAudioSession.h>

次に、このメソッドを呼び出すだけです

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

このメソッドを初めて実行すると、マイクへのアクセスを許可するプロンプトが表示され、ユーザーの応答に基づいて完了ブロックが実行されます。 2回目以降は、デバイスに保存されている設定に基づいて動作します。

42
Luis E. Prado

迅速な回答:

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

または、PermissionScopeのようなフレームワークを使用して、アクセス許可を簡単に確認できます。 https://github.com/nickoneill/PermissionScope

編集:Swift 3答え:

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

Appleの開発フォーラム以外でiOS 7について話すことを許可されているかどうかは100%確信はありませんが 、あなたが探している答えが見つかりました

つまり、SDKのAVAudioSession.hヘッダーファイルにソリューションがあります。 iOS 6を引き続きサポートしながら使用したい場合は、必ず「respondsToSelector: "APIの可用性を確認します。

1