Audio Focusは、複数のアプリケーションによる音声出力の同時使用を調整するAndroidのメカニズムです。音の重なりを防ぎます:あるアプリが再生を開始すると、システムが自動的に別のアプリの音声を下げるか一時停止します。Android Developer Guide, 2026によると、Audio Focusは音声を再生するすべてのアプリに必須です — これがないとGoogle Playがアップデートを拒否する可能性があります。
重要なポイント
Audio Focusは、Androidにおける集中型オーディオ調停システムです。アプリがフォーカスを要求すると、システムはアクティブなフォーカスの「所有者」がいるかどうかを確認し、所有者に喪失通知を送信します。所有者はフォーカスの種類に応じて、音量を下げる(ダック)、再生を一時停止する、または無視することができます。
Android 8.0以前は、フォーカスはAudioManager.requestAudioFocus(callback, stream, durationHint)を介して管理されていました。Android 8.0以降、AudioFocusRequestが導入され、要求タイプと自動フォーカス復元を指定できるようになりました。Android 12ではメカニズムが強化され、Google Playで公開するためにはすべてのメディアプレーヤーが正しくフォーカスを処理する必要があります。
Google I/O 2024によると、音声アプリのレビューにおけるユーザー苦情の約15%が音の重なりに関連しています。適切なAudio Focusの実装はこの問題を解決し、視聴時間におけるユーザーエクスペリエンスを30%向上させます。
Audio Focusは自動的に再生を制御しないことを理解することが重要です。フォーカスイベントについてアプリに通知するだけです。アプリ自体が、プレーヤーを一時停止するか、音量を下げるか、再生を続けるかを決定します。システムは強制しません — このアーキテクチャ上の決定は開発者に委ねられています。
例外はナビゲーションアプリ(Google Maps、Yandex Maps)です。これらはAUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCKフォーカスタイプを要求でき、既存のプレーヤーの音量が下げられ、その上に音声プロンプトが再生されます。プロンプトが終了すると、プレーヤーは自動的に音量を復元します。
システムは単一のアクティブなオーディオフォーカス所有者を維持します。新しいアプリがフォーカスを要求すると、システムは優先順位を決定し、現在の所有者にイベントを送信します。現在の所有者がイベントを無視して大音量で再生を続けた場合、システムは罰則を適用しません — 責任は完全にプレーヤーにあります。
フォーカス要求にはdurationHintパラメータが含まれ、システムに推定期間を伝えます:AUDIOFOCUS_GAIN(長時間再生 — 音楽、ポッドキャスト)、AUDIOFOCUS_GAIN_TRANSIENT(短期間 — 通知音、ナビゲーション)、AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK(既存のプレーヤーの音量を下げる許可付きの短期間)。
フォーカス喪失時、アプリは3つのコードのいずれかを受け取ります:AUDIOFOCUS_LOSS(長期的な喪失 — 別のアプリが音楽を開始)、AUDIOFOCUS_LOSS_TRANSIENT(一時的な喪失 — 電話、通知)、AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK(音量低減の可能性を伴う一時的な喪失)。各コードには独自の対応が必要です。
ユーザーがアプリAで音楽を聴いています。電話がかかってきます — アプリB(電話)がAUDIOFOCUS_GAIN_TRANSIENTを要求します。システムはアプリAにAUDIOFOCUS_LOSS_TRANSIENTを送信します。プレーヤーが一時停止します。電話が終了した後、アプリBはフォーカスを解放し、システムはAUDIOFOCUS_GAINを介してアプリAに通知します — プレーヤーが再生を再開します。チェーン全体は50ミリ秒未満で完了します。
正しいdurationHintを選択することは、Audio Focusを実装する際の重要な決定です。誤ったタイプの選択は、音の重なり、不必要なプレーヤーの停止、またはユーザーの不満につながります。
| 要求タイプ | シナリオ | 所有者の反応 |
|---|---|---|
| AUDIOFOCUS_GAIN | 音楽、ポッドキャストの開始 | AUDIOFOCUS_LOSS — プレーヤーは停止する必要があります |
| AUDIOFOCUS_GAIN_TRANSIENT | 電話、音声通知 | AUDIOFOCUS_LOSS_TRANSIENT — 一時停止 |
| AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK | GPS案内、短い信号 | AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK — 音量を下げる |
| AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE | 音声検索、録音 | AUDIOFOCUS_LOSS — 完全停止 |
ダック(Duck)は、2次的な音が再生されている間、メインプレーヤーの音量を20~30%に一時的に低下させることです。AndroidはAudioManager.adjustSuggestedStreamVolumeを介して手動ダックのAPIを提供していますが、ほとんどのプレーヤーは独自の手段でダックを実装しています。Androidドキュメント(2026)によると、ダック処理は3秒以内で行われるべきで、その後音量が復元されます。
Audio Focusを正しく実装するには、3つのステップを順番に実行する必要があります:要求を作成し、再生前にフォーカスを要求し、コールバックでイベントを処理します。AndroidXメディアのAudioFocusRequestCompatを使用すると、すべてのAndroidバージョンとの互換性が保証されます。
val audioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager
val focusRequest = AudioFocusRequestCompat.Builder()
.setFocusGain(AudioManagerCompat.AUDIOFOCUS_GAIN)
.setOnAudioFocusChangeListener(focusChangeListener)
.build()
val result = AudioManagerCompat.requestAudioFocus(audioManager, focusRequest)
if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
startPlayback()
}
フォーカス要求は、ユーザーがPlayを押すたびに、再生を開始する前に実行する必要があります。結果がAUDIOFOCUS_REQUEST_GRANTEDの場合は再生を開始します。DENIEDの場合は、ユーザーにメッセージを表示するか、フォーカスが取得されるまで再生を延期します。
private val focusChangeListener = AudioManager.OnAudioFocusChangeListener { focusChange ->
when (focusChange) {
AudioManager.AUDIOFOCUS_GAIN -> {
restoreVolume()
if (wasPlayingBeforeLoss) resumePlayback()
}
AudioManager.AUDIOFOCUS_LOSS -> {
pausePlayback()
wasPlayingBeforeLoss = false
}
AudioManager.AUDIOFOCUS_LOSS_TRANSIENT -> {
pausePlayback()
wasPlayingBeforeLoss = true
}
AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK -> {
duckVolume()
}
}
}
コールバックでは、AUDIOFOCUS_LOSSとAUDIOFOCUS_LOSS_TRANSIENTを区別することが重要です。最初のケースでは、プレーヤーは自動的に再開すべきではありません — ユーザーが明示的に別の音声を開始しました。2番目のケースでは、AUDIOFOCUS_GAINを受信すると自動的に再開できます。wasPlayingBeforeLossフラグは、再生を復元する必要があるかどうかを記憶するのに役立ちます。
private fun abandonAudioFocus() {
AudioManagerCompat.abandonAudioFocusRequest(audioManager, focusRequest)
}
abandonAudioFocusRequestを呼び出すと、アプリがもうフォーカスを必要としないことをシステムに通知します。これはプレーヤーの一時停止と停止時に呼び出すことが重要です。フォーカスが解放されないと、AUDIOFOCUS_GAINを要求する別のアプリがLOSSを受け取らず、音が重なります。
フォーカス喪失を正しく処理することは、Google Playのレビューを通過するための重要な要件です。誤った処理は否定的なレビューにつながります:ユーザーは電話中やナビゲーション中に音楽が再生され続けると不満を述べます。
AUDIOFOCUS_LOSSを受信した場合、プレーヤーは停止し、ユーザーが明示的にPlayを押すまで再開してはいけません。AUDIOFOCUS_LOSS_TRANSIENT(電話、通知)の場合、プレーヤーは一時停止し、フォーカスが復元されると自動的に再開します。AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCKの場合、プレーヤーは外部オーディオが再生されている間、一時的に音量を20~30%に低下させます。
Androidデベロッパーガイド(2026)によると、ダックは現在のAudioTrack音量レベルに0.2~0.3の係数を乗算して実装する必要があります。AudioManager.setStreamVolumeは使用しないでください — これはシステム音量を変更し、他のアプリに影響を与えます。ダックは自分のプレーヤー側でのみ実行されます。
着信時、システムは自動的に電話アプリを介してAUDIOFOCUS_GAIN_TRANSIENTを要求します。プレーヤーはAUDIOFOCUS_LOSS_TRANSIENTを受け取り、一時停止します。電話が終了した後、またはユーザーが電話を拒否した場合、フォーカスが戻ります — 音楽プレーヤーの場合、プレーヤーは自動的に再生を再開します。
ナビゲーションアプリ(Google Maps)の場合、音声案内中にAUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCKが使用されます。プレーヤーの音量は2~3秒間下げられ、その後音量が復元されます。ユーザーが音楽ではなくポッドキャストを聴いている場合、ダックよりも一時停止の方が適切です — ポッドキャストでは毎秒が重要です。
実際には、開発者はAudio Focusが異なる動作をするいくつかの標準的なシナリオに直面します。典型的なケースと正しい対応を見てみましょう。
フォーカス喪失前に音楽が再生されていたかどうかを記憶するフラグを実装することが重要です。ユーザーが自分で一時停止し、その後電話がかかってきた場合 — 再開しないでください。フラグはユーザーの明示的な一時停止でリセットされ、再生開始時に設定されます。
GoogleのUX調査(2024)によると、電話後の自動再開はユーザー満足度を22%向上させます。しかし、ユーザーがすでにビデオの視聴を開始した後にプレーヤーが再開すると — これは不快感を引き起こします。wasPlayingBeforeLossフラグは誤った再開を防ぎます。
よくある質問
はい、Android 12以降、Google Playは音声を再生するすべてのアプリにAudio Focusの実装を推奨しています。Music & Audioカテゴリのアプリは公開のために実装する必要があります。無視するとアップデートが拒否される可能性があります。
プレーヤーを起動し、次に別の音声アプリ(YouTube Musicなど)を開きます。プレーヤーが一時停止するはずです。次にYouTube Musicを閉じます — プレーヤーが自動的に再開するはずです。ダックテストには、音声案内付きのGoogle Mapsを使用します。
システムは次のように伝えます:「別のアプリが短い音を一時的に再生する必要があります — プレーヤーの音量を下げてください。」これは音声案内や短い通知に最適です。外部音声が終了すると、手動操作なしで音量が復元されます。
形式的にははい — システムは強制しません。しかし実際にはこれは音の重なりを意味します。ユーザーは音楽と電話を同時に聞くことになり、ネガティブな体験につながります。Googleは常にプレーヤーを停止してAUDIOFOCUS_LOSSを処理することを推奨しています。
iOSでは、同等の役割をAudio Sessionが担い、AVAudioSessionを介して管理されます。メカニズムは似ています:カテゴリとオプションが音の重なり時の動作を定義します。ただし、APIとルールは大幅に異なります — 各フレームワークは独自の方法で実装されています。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。