Audio Focus:概念、モード、Androidでの管理

著者: IT Sectr 公開日: 2026-05-23 読了時間: 8 分

Audio Focusは、複数のアプリケーションによる音声出力の同時使用を調整するAndroidのメカニズムです。音の重なりを防ぎます:あるアプリが再生を開始すると、システムが自動的に別のアプリの音声を下げるか一時停止します。Android Developer Guide, 2026によると、Audio Focusは音声を再生するすべてのアプリに必須です — これがないとGoogle Playがアップデートを拒否する可能性があります。

重要なポイント

  • Audio Focusは、アプリ間の音声再生を音の重なりなく調整するためのシステムメカニズムです。
  • フォーカスの要求は、再生の種類と期間を指定してAudioManager.requestAudioFocus()を介して行われます。
  • システムはAudioManager.OnAudioFocusChangeListenerを介してAUDIOFOCUS_GAIN、LOSS、DUCKコードでフォーカス変更を通知します。
  • Auto Resume — AUDIOFOCUS_LOSSを受信するとアプリは再生を一時停止し、AUDIOFOCUS_GAINで再開する必要があります。
  • Android 12+では、フォーカス要求を作成するためにAndroidXのAudioFocusRequestCompatの使用が必要です。

Audio Focusとは?

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とメディア再生

Audio Focusは自動的に再生を制御しないことを理解することが重要です。フォーカスイベントについてアプリに通知するだけです。アプリ自体が、プレーヤーを一時停止するか、音量を下げるか、再生を続けるかを決定します。システムは強制しません — このアーキテクチャ上の決定は開発者に委ねられています。

例外はナビゲーションアプリ(Google Maps、Yandex Maps)です。これらはAUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCKフォーカスタイプを要求でき、既存のプレーヤーの音量が下げられ、その上に音声プロンプトが再生されます。プロンプトが終了すると、プレーヤーは自動的に音量を復元します。

AndroidでAudio Focusが機能する仕組み

システムは単一のアクティブなオーディオフォーカス所有者を維持します。新しいアプリがフォーカスを要求すると、システムは優先順位を決定し、現在の所有者にイベントを送信します。現在の所有者がイベントを無視して大音量で再生を続けた場合、システムは罰則を適用しません — 責任は完全にプレーヤーにあります。

フォーカス要求にはdurationHintパラメータが含まれ、システムに推定期間を伝えます:AUDIOFOCUS_GAIN(長時間再生 — 音楽、ポッドキャスト)、AUDIOFOCUS_GAIN_TRANSIENT(短期間 — 通知音、ナビゲーション)、AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK(既存のプレーヤーの音量を下げる許可付きの短期間)。

フォーカス喪失時、アプリは3つのコードのいずれかを受け取ります:AUDIOFOCUS_LOSS(長期的な喪失 — 別のアプリが音楽を開始)、AUDIOFOCUS_LOSS_TRANSIENT(一時的な喪失 — 電話、通知)、AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK(音量低減の可能性を伴う一時的な喪失)。各コードには独自の対応が必要です。

Audio Focusイベントチェーン

ユーザーがアプリAで音楽を聴いています。電話がかかってきます — アプリB(電話)がAUDIOFOCUS_GAIN_TRANSIENTを要求します。システムはアプリAにAUDIOFOCUS_LOSS_TRANSIENTを送信します。プレーヤーが一時停止します。電話が終了した後、アプリBはフォーカスを解放し、システムはAUDIOFOCUS_GAINを介してアプリAに通知します — プレーヤーが再生を再開します。チェーン全体は50ミリ秒未満で完了します。

Audio Focus要求のタイプとモード

正しいdurationHintを選択することは、Audio Focusを実装する際の重要な決定です。誤ったタイプの選択は、音の重なり、不必要なプレーヤーの停止、またはユーザーの不満につながります。

要求タイプシナリオ所有者の反応
AUDIOFOCUS_GAIN音楽、ポッドキャストの開始AUDIOFOCUS_LOSS — プレーヤーは停止する必要があります
AUDIOFOCUS_GAIN_TRANSIENT電話、音声通知AUDIOFOCUS_LOSS_TRANSIENT — 一時停止
AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCKGPS案内、短い信号AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK — 音量を下げる
AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE音声検索、録音AUDIOFOCUS_LOSS — 完全停止

AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCKの特性

ダック(Duck)は、2次的な音が再生されている間、メインプレーヤーの音量を20~30%に一時的に低下させることです。AndroidはAudioManager.adjustSuggestedStreamVolumeを介して手動ダックのAPIを提供していますが、ほとんどのプレーヤーは独自の手段でダックを実装しています。Androidドキュメント(2026)によると、ダック処理は3秒以内で行われるべきで、その後音量が復元されます。

コードでのAudio Focusの実装

Audio Focusを正しく実装するには、3つのステップを順番に実行する必要があります:要求を作成し、再生前にフォーカスを要求し、コールバックでイベントを処理します。AndroidXメディアのAudioFocusRequestCompatを使用すると、すべてのAndroidバージョンとの互換性が保証されます。

Audio Focus要求の作成と実行

kotlin
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の場合は、ユーザーにメッセージを表示するか、フォーカスが取得されるまで再生を延期します。

フォーカス変更コールバック

kotlin
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_LOSSAUDIOFOCUS_LOSS_TRANSIENTを区別することが重要です。最初のケースでは、プレーヤーは自動的に再開すべきではありません — ユーザーが明示的に別の音声を開始しました。2番目のケースでは、AUDIOFOCUS_GAINを受信すると自動的に再開できます。wasPlayingBeforeLossフラグは、再生を復元する必要があるかどうかを記憶するのに役立ちます。

Audio Focusの解放

kotlin
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が異なる動作をするいくつかの標準的なシナリオに直面します。典型的なケースと正しい対応を見てみましょう。

  • 音楽 + 電話 — プレーヤーが一時停止します(AUDIOFOCUS_LOSS_TRANSIENT)。電話後、ユーザーがプレーヤーを操作していなければ自動的に再開します。
  • 音楽 + ナビゲーション — 音声案内中にプレーヤーの音量が下げられます(DUCK)。フレーズ終了後に音量が復元されます。
  • ユーザーが別のアプリを起動 — プレーヤーはAUDIOFOCUS_LOSSを受け取り停止します。再開はPlayボタンのみ。
  • バックグラウンドでのビデオ + 音楽 — ビデオプレーヤーがAUDIOFOCUS_GAINを要求します。音楽プレーヤーはLOSSを受け取り停止します。
  • 音声検索(Google Assistant) — アプリはAUDIOFOCUS_LOSS_TRANSIENTを受け取り、一時停止し、アシスタントの応答後に自動的に再開します。

フォーカス喪失後の自動再開

フォーカス喪失に音楽が再生されていたかどうかを記憶するフラグを実装することが重要です。ユーザーが自分で一時停止し、その後電話がかかってきた場合 — 再開しないでください。フラグはユーザーの明示的な一時停止でリセットされ、再生開始時に設定されます。

GoogleのUX調査(2024)によると、電話後の自動再開はユーザー満足度を22%向上させます。しかし、ユーザーがすでにビデオの視聴を開始した後にプレーヤーが再開すると — これは不快感を引き起こします。wasPlayingBeforeLossフラグは誤った再開を防ぎます。

よくある質問

Audio Focusは音声のあるすべてのアプリに必須ですか?

はい、Android 12以降、Google Playは音声を再生するすべてのアプリにAudio Focusの実装を推奨しています。Music & Audioカテゴリのアプリは公開のために実装する必要があります。無視するとアップデートが拒否される可能性があります。

Audio Focusが正しく動作していることを確認するには?

プレーヤーを起動し、次に別の音声アプリ(YouTube Musicなど)を開きます。プレーヤーが一時停止するはずです。次にYouTube Musicを閉じます — プレーヤーが自動的に再開するはずです。ダックテストには、音声案内付きのGoogle Mapsを使用します。

実際にはAUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCKとは何ですか?

システムは次のように伝えます:「別のアプリが短い音を一時的に再生する必要があります — プレーヤーの音量を下げてください。」これは音声案内や短い通知に最適です。外部音声が終了すると、手動操作なしで音量が復元されます。

Audio Focus喪失要求を拒否できますか?

形式的にははい — システムは強制しません。しかし実際にはこれは音の重なりを意味します。ユーザーは音楽と電話を同時に聞くことになり、ネガティブな体験につながります。Googleは常にプレーヤーを停止してAUDIOFOCUS_LOSSを処理することを推奨しています。

Audio FocusはAndroid以外のプラットフォームでも機能しますか?

iOSでは、同等の役割をAudio Sessionが担い、AVAudioSessionを介して管理されます。メカニズムは似ています:カテゴリとオプションが音の重なり時の動作を定義します。ただし、APIとルールは大幅に異なります — 各フレームワークは独自の方法で実装されています。

まとめ

  • Audio FocusはAndroidのシステムオーディオ調停者であり、異なるアプリ間での音の重なりを防ぎます。
  • フォーカス要求はAudioFocusRequestCompatを介してdurationHint:GAIN、TRANSIENT、またはTRANSIENT_MAY_DUCKを指定して行われます。
  • OnAudioFocusChangeListenerコールバックは4つのイベントを処理します:GAIN、LOSS、LOSS_TRANSIENT、LOSS_TRANSIENT_CAN_DUCK。
  • AUDIOFOCUS_LOSSではプレーヤーが停止;TRANSIENTでは自動再開付きの一時停止;DUCKでは音量低減。
  • ユーザーの明示的な一時停止後の再開を避けるために、wasPlayingBeforeLossフラグを追跡することが重要です。
  • abandonAudioFocusRequestによるフォーカスの解放は、プレーヤーの一時停止と停止時に必須です。
  • iOSでは、Audio Focusの相当物はAudio Session(AVAudioSession)で、独自のカテゴリとモードを持ちます。

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください