Microphone Permissionは、アプリケーションがデバイスのマイクにアクセスするために必要なシステム権限です。オーディオ録音、ボイスメッセージ、ビデオ通話、音声認識に必要です。Apple Developer Documentation、2024によると、オーディオキャプチャを使用するすべてのアプリケーションは、システムダイアログを通じて明示的なユーザーの同意を求める義務があります。
重要ポイント
Microphone Permissionは、デバイスのマイクから不正なオーディオ録音を防ぐプライバシー保護メカニズムです。モバイルプラットフォームは、オーディオ録音が個人の会話、周囲の環境、機密情報をキャプチャする可能性があるため、マイクを最も機密性の高いリソースの一つと見なしています。
AndroidはRECORD_AUDIOを危険な権限に分類し、iOSはInfo.plistにNSMicrophoneUsageDescriptionキーを必須で追加する必要があります。両方のプラットフォームで、リクエストは実行時に行われ、ユーザーはシステム設定からいつでも権限を取り消せます。システムの録音インジケーター(iOSのオレンジ色の点、Android 12+の緑色のインジケーター)は、アプリケーションが現在マイクを使用していることをユーザーに知らせます。
Pew Research Center(2024)の調査によると、モバイルデバイスユーザーの54%が少なくとも一度はアプリケーションのマイクアクセスを拒否しています。主な理由は、アプリがなぜオーディオ録音を必要とするのか理解できないことです。したがって、開発者はマイク使用の目的を可能な限り透明に説明する必要があります。
Androidでのマイク権限は、マニフェストでRECORD_AUDIOを宣言し、アプリケーションコードで実行時リクエストを行うことによって要求されます。Android 10以降、マイクへのアクセスはバックグラウンドアプリケーションの制限によってさらに規制されています。
最初のステップは、マニフェストファイルでRECORD_AUDIO権限を宣言することです。この宣言がないと、実行時リクエストは効果がなく、アプリケーションはマイクにアクセスできません。
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CAPTURE_AUDIO_OUTPUT" />
CAPTURE_AUDIO_OUTPUTはサードパーティアプリケーションが利用できないシステム権限です。これはシステムアプリケーションのみがオーディオ出力をキャプチャするために使用します。通常のアプリケーションはマイク録音にRECORD_AUDIOのみが必要です。
マニフェストで宣言した後、実行時リクエストを実行する必要があります。AudioRecordを使用してマイクからオーディオを録音する例を見てみましょう。
private val recordAudioPermission =
registerForActivityResult(ActivityResultContracts.RequestPermission()) { granted ->
if (granted) {
startRecording()
} else {
showMicrophoneExplanation()
}
}
fun startRecording() {
val sampleRate = 44100
val bufferSize = AudioRecord.getMinBufferSize(sampleRate,
AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT)
val recorder = AudioRecord(MediaRecorder.AudioSource.MIC,
sampleRate, AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT, bufferSize)
recorder.startRecording()
// オーディオデータをバッファに録音中
}
オーディオ録音のライフサイクルを適切に処理することが重要です。Android 9以上でアプリケーションがバックグラウンドに移動すると、マイク録音がシステムによって一時停止される場合があります。Android 10以降、バックグラウンドのマイクアクセスはさらに制限されています。バックグラウンドのアプリは録音を開始できず、アクティブな録音は一時停止されます。バックグラウンド録音にはMediaProjectionまたは通知付きのServiceが必要です。
iOSでのマイク権限は、Info.plistのNSMicrophoneUsageDescriptionキーとAVAudioSession.requestRecordPermissionメソッドの呼び出しによって構成されます。Appleは、リクエストダイアログでマイク使用理由の必須説明を要求します。
NSMicrophoneUsageDescriptionキーは、マイクアクセスを要求するすべてのアプリケーションに必須です。これがないと、オーディオ録音を試みるとアプリケーションがクラッシュします。
<key>NSMicrophoneUsageDescription</key>
<string>ボイスメモを録音し、オーディオメッセージを送信するために、アプリはマイクへのアクセスが必要です。</string>
iOSでのマイクアクセスリクエストはAVAudioSessionを通じて行われます。応答を受け取った後、アプリケーションはオーディオセッションを構成し、録音を開始します。
import AVFAudio
func requestMicrophoneAccess() {
AVAudioSession.sharedInstance().requestRecordPermission { granted in
DispatchQueue.main.async {
if granted {
self.configureAudioSession()
self.startAudioRecording()
} else {
self.redirectToSettings()
}
}
}
}
private func configureAudioSession() {
let session = AVAudioSession.sharedInstance()
do {
try session.setCategory(.playAndRecord, mode: .default)
try session.setActive(true)
} catch {
print("Audio session error: \(error)")
}
}
iOS 14以降、マイクを使用するアプリケーションはステータスバーにオレンジ色のインジケーターを表示します。ユーザーは現在どのアプリケーションがオーディオを録音しているかを確認できます。正当な理由なくアプリケーションがバックグラウンドでマイクを使用する場合、Appleはアップデートを拒否する可能性があります。AVAudioSessionを使用すると、オーディオセッションのカテゴリとモードを構成でき、バックグラウンド移行時のアプリケーションの動作を決定します。
モバイルアプリケーションにおけるマイク使用シナリオは多様です。単純な音声録音からリアルタイムの複雑なオーディオストリーム処理までさまざまです。
メッセンジャーやメモアプリは、ボイスメッセージを録音するためにマイクを使用します。この場合、録音ボタンを押すとMicrophone Permissionが要求されます。録音完了後は、他のアプリケーションがマイクを使用できるようにオーディオセッションを停止することが重要です。iOSのAVAudioSessionとAndroidのAudioManagerがオーディオフォーカスを管理します。
音声入力(検索、ディクテーション、音声アシスタント)を使用するアプリケーションは、音声認識APIと組み合わせてマイクを使用します。Androidではandroid.speechのSpeechRecognizer、iOSではSpeechフレームワークのSFSpeechRecognizerです。音声認識には、認識サービス(AndroidのSPEECH、iOSのSFSpeechRecognizer.requestAuthorization)への追加の権限が必要な場合があります。
ビデオ通話アプリケーション(WebRTC、Zoom、Telegram)は、Camera Permissionと同時にMicrophone Permissionを要求します。このコンテキストでは、ユーザーがダイアログで圧倒されないように、両方の権限を同時にではなく順番に要求することが重要です。WebRTCはオーディオとビデオのキャプチャにgetUserMediaを使用しますが、モバイルプラットフォームでは最初にシステム権限が必要です。
高品質な録音のためには、オーディオセッションパラメータを適切に構成する必要があります。iOSでは.playAndRecordカテゴリにより、サウンドの再生と録音を同時に行えます。Androidでは、AudioSource.MICを選択するとメインマイクからのキャプチャが提供され、AudioSource.VOICE_COMMUNICATIONは音声通信用に録音を最適化します。さらに、標準的なCD品質を得るためにサンプリングレート44100 Hz、PCM 16ビット形式を設定できます。
オーディオ録音中に、着信、アラーム作動、別のアプリケーションからの通知などのシステム割り込みが発生する可能性があります。iOSではAVAudioSessionDelegateがbeginInterruptionとendInterruptionを処理します。AndroidではAudioManager.OnAudioFocusChangeListenerがオーディオフォーカスの喪失または復帰をアプリケーションに通知します。適切な割り込み処理により、予期しないイベント発生時に録音を保存し、データ損失を回避できます。フォーカスを失ったときに録音を一時停止し、復帰後にユーザーに通知して再開することをお勧めします。
オーディオキャプチャの最適化には、サンプリングレート、バッファサイズ、エンコード形式の構成が含まれます。ボイスメッセージには44100 Hzの周波数とモノラルチャンネルで十分です。音声認識には16000 Hzの周波数が必要な場合があります。
iOSでは、録音レイテンシを構成するためにAVAudioSession.setPreferredIOBufferDurationを使用します。バッファを小さくするとレイテンシは減少しますが、CPU負荷が増加します。Androidでは、AudioRecord.getMinBufferSizeが指定されたパラメータの最小バッファサイズを返します。システム負荷が高い状態で録音する際のデータ損失を防ぐために、この最小値以上のバッファを使用することをお勧めします。
ベストプラクティスは、ユーザーの信頼を高め、プラットフォームの要件を満たすことを目的としています。
Microphone Permissionを要求する前に、アプリがなぜマイクを必要とし、録音がどのように使用されるかを説明する画面を表示します。オーディオがサーバーに送信されるか、ローカルで処理されるかを示します。録音がデバイスから出ないことを理解すれば、ユーザーはアクセスを許可する可能性が大幅に高まります。ローカル処理(オンデバイスASR)は信頼を得る強力な根拠です。
アプリケーションがバックグラウンドでのオーディオ録音を必要としない場合、バックグラウンドに移行する際に必ずマイクを停止してください。これによりバッテリーを節約するだけでなく、録音インジケーターを見たユーザーの否定的な反応も防げます。iOSでは、録音を一時停止するためにUIApplicationDelegateのapplicationDidEnterBackgroundメソッドを使用します。Androidでは、ActivityまたはServiceでonPauseとonStopを処理します。
オーディオキャプチャ中に独自の録音インジケーター(アニメーション化されたマイクアイコンや波形)を表示します。これにより、マイクがアクティブであることがユーザーに伝わり、否定的な反応のリスクが軽減されます。AppleとGoogleは、最大限の透明性のためにシステムインジケーターを独自のUI要素で複製することを推奨しています。
よくある質問
いいえ、マイク権限はマイクからのオーディオキャプチャにのみ必要です。スピーカーやヘッドフォンからのサウンド再生にはMicrophone Permissionは不要です。再生には、iOSでオーディオセッションを構成するか、AndroidでAudioTrackを構成すれば十分です。
ContextCompat.checkSelfPermission(context, Manifest.permission.RECORD_AUDIO)を使用します。このメソッドはPackageManager.PERMISSION_GRANTEDまたはPERMISSION_DENIEDを返します。さらに、PackageManager.hasSystemFeatureを使用してデバイスでマイクが利用可能かどうかを確認します。
代替シナリオを提供します:音声の代わりにテキスト入力、オーディオなしでメッセージを送信、音声なしでビデオを視聴。音声入力機能が重要な場合は、システム設定で権限を有効にする方法の説明とそこに移動するボタンを表示します。
Android 12以降、バックグラウンドのアプリケーションはマイクにアクセスできません。バックグラウンドに移行するとアクティブな録音は一時停止されます。さらに、Privacy Chipインジケーターが導入されました—ステータスバーの緑色のアイコンで、アプリケーションがマイクを使用していることを示します。
最も一般的な理由:NSMicrophoneUsageDescriptionキーの欠落、不特定な理由の説明(“ボイスメッセージの録音用”ではなく“サービス改善のため”)、明示的なユーザーアクションなしでの権限要求、または正当な機能なしでのバックグラウンドでのマイク使用です。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。