バックグラウンド音声の強化

Android 17 以降では、オーディオ フレームワークが、オーディオ再生、オーディオ フォーカス リクエスト、音量変更 API などのバックグラウンド オーディオ インタラクションに対する制限を適用し、これらの変更がユーザーによって意図的に開始されるようにします。

アプリ デベロッパーが、表示されるアクティビティなしで音声を制御しようとする場合は、使用中(WIU)機能で開始されたフォアグラウンド サービス(SHORT_SERVICE タイプではない)がアプリにあることを確認する必要があります。フォアグラウンド サービスは、MediaSessionEvent に応答して開始された場合、またはアプリがユーザーに表示されている間に開始された場合に、WIU 機能を付与されます。

アプリが有効なライフサイクルにないときにアプリがオーディオ API を呼び出そうとすると、オーディオ再生 API と音量変更 API は例外をスローしたり、エラー メッセージを提供したりすることなく、サイレントに失敗します。オーディオ フォーカス API が結果コード AUDIOFOCUS_REQUEST_FAILED で失敗します。

これらの制限を導入する目的は、意図しないバックグラウンド音声のバグ エクスペリエンスを減らすことです。以下にいくつか例を示します。

  • フォアグラウンド サービスなしで音声を再生しているアプリはフリーズされる可能性があります。アプリが最終的にフリーズ解除されると、数時間後に予期せず音声再生が再開されます。
  • フォアグラウンド サービスなしで音声を再生するアプリは、さまざまな実行制限に直面し、音声パフォーマンスが途切れるという結果になりました。
  • 再生がアクティビティのライフサイクルから切り離され、再生セッションやフォーカス イベントがリークし、ユーザーが再生を停止できない状態になる可能性があります。

意図的な音声のユースケースで悪影響が生じる場合は、デベロッパーがアプリをテストし、動作の変更についてフィードバックを提供することをおすすめします。問題が発生した場合は、Android 17 アプリの互換性に関する問題のトラッカーを使用してご報告ください。

影響を受けるバックグラウンド オーディオのユースケースを特定する

音声再生の実装を監査し、アプリが条件付きの状況でもバックグラウンド音声操作機能を提供することを意図しているかどうかを特定します。

アプリが、ユーザーに表示されるアクティビティを表示している間(ピクチャー イン ピクチャー(PiP)モードの使用を含む)にのみ、オーディオを再生したりオーディオ API を利用したりすることを目的としている場合、これらの変更の影響は受けません。

アプリがビデオ通話アプリなどの VOIP 機能を提供している場合、音声の録音を成功させるために、再生用に導入される要件(通常は推奨されるテレコム API の利用)をすでに満たしている必要があります。そのため、影響を受ける可能性は低いと考えられます。

画面がオフになっている間や、ユーザーがアクティビティを完全に閉じた後も音声再生を継続することを目的とするアプリ(音楽ストリーミング アプリやポッドキャスト アプリでよく見られる)は、バックグラウンド音声機能を提供していると見なされ、新しい要件を満たす必要があります。

影響を受ける可能性が高いバックグラウンド オーディオのシナリオ

アプリが開いている間、またはユーザーの明示的なトリガーに応じて開始された音声操作を継続するモデルにアプリが準拠していない場合、アプリの機能はサイレントで抑制される可能性があります。

たとえば、アプリが BOOT_COMPLETE に応答してフォアグラウンド サービスを開始し、音声の操作を試みると、抑制されます。

影響を軽減するためのバックグラウンド オーディオのベスト プラクティス

  • media3 Jetpack ライブラリの MediaSessionService コンポーネントを使用して、バックグラウンドでの音声再生を管理します。

    その場合、ライブラリが再生ライフサイクルの管理を支援するため、アプリがバックグラウンドの強化による影響を受ける可能性は低くなります。

  • media3 ライブラリを活用していない場合は、mediaPlayback FGS を手動で開始する必要があります。バックグラウンドで音声が再生される可能性がある場合は、アプリがフォアグラウンドにある間に常にフォアグラウンド サービスを開始します。

    たとえば、アプリが通常はフォアグラウンド専用の動画ストリーミング アプリで、画面がオフのときに再生を継続するためのユーザー アフォーダンスが含まれている場合、ユーザーが開始した再生トリガーが発生したときに、アプリは引き続きフォアグラウンド サービスを開始する必要があります。

    これにより、フォアグラウンド サービスが WIU 機能とともに開始されます。

  • 10 分未満の一時的な障害が発生した場合、mediaPlayback FGS を有効な状態に保ちます。

    ネットワーク アクティビティによるバッファリングの問題など、アプリに一時的な障害が発生した場合や、AUDIOFOCUS_LOSS_TRANSIENT などの一時的な中断が想定される場合は、再生のインテントを継続する必要があります。そのため、FGS はアクティブな状態を維持する必要があります。

  • 再生の終了時にフォアグラウンド サービスを停止し、ユーザーが明示的に再生を再開した場合にのみ再生を再開します。

    再生を終了する永続的なシグナル(自動再生なしでコンテンツが完了した場合、AUDIOFOCUS_LOSS、UMO からの一時停止イベント、メディア キーイベントなど)または回復不能な障害が発生した場合、アプリは音声操作を停止し、フォアグラウンド サービスを停止し、メディア セッションを終了する必要があります。これらすべての処理は、ユーザーが望むバックグラウンド オーディオのインタラクションを「終了」するという概念に対応しています。この操作を行うと、アプリはバックグラウンドでの音声操作機能を失います。

    その後、ユーザーがアプリの UI や Universal Media Object の再生ボタンなどを使用して明示的に再生を再開すると、音声再生を開始するインテントが返され、新しい FGS が開始されます。

  • adb shell コマンドを使用して、音声再生の動作をテストします。

Android 16 と Android 17 での変更のテスト

この機能は、Android 16 以降ではすでに「警告」レベルで実装されています。つまり、アプリは adb shell cmd audio set-enable-hardening を使用して、バックグラウンド オーディオの強化の適用を手動でテストできます。

Android 16 を搭載したデバイスで適用を有効にするには、次のコマンドを実行します。

adb shell cmd audio set-enable-hardening 1

Android 17 を搭載したデバイスで適用を無効にするには、次のコマンドを実行します。

adb shell cmd audio set-enable-hardening 0

また、logcat または adb コマンド adb dumpsys audio を使用して、オーディオ ハーデニングの適用によりアプリでサイレント障害が発生したかどうかを確認することをおすすめします。ログに AudioHardening とパッケージ名がプレフィックスとして付いたエントリが含まれている場合、その呼び出しは行われています。

使用中の機能による FGS について

通常、フォアグラウンド サービス(FGS)は、アプリがフォアグラウンドにある間に起動して、ユーザーが開始したオペレーションを延長する必要があります。特定のケースでは、アプリがバックグラウンドにあるときにフォアグラウンド サービスを起動できます。ただし、これらのフォアグラウンド サービスには通常、使用中の(WIU)機能は付与されません。

WIU はセキュリティ ゲートとして機能します。バックグラウンドから開始された FGS が、ユーザーがアプリのアクティビティを認識していない可能性がある場合に、特定の機密性の高い動作を行うのを防ぎます。これにより、アプリが位置情報、カメラ、マイクなどの機密データにアクセスできなくなります。また、Android 17 以降では、通常は表示可能な UI コンテキストを必要とするオーディオ API もブロックされます。

参考資料:

  • 標準 FGS: アプリが表示されている間に開始されたサービス、またはバックグラウンド アクティビティの起動機能が付与されたサービスには、WIU へのアクセス権が付与されます。
  • バックグラウンド開始 FGS(BFSL): ほとんどの場合、WIU へのアクセス権は付与されません。WIU を許可する主な例外は、明示的なユーザーの意図を伴うインタラクションです。たとえば、通知のクリック、ウィジェットの操作、外部デバイスからのメディアキー イベントなどです。
  • システムが FGS を開始: システムサーバー委任(たとえば、Telecom Jetpack ライブラリを使用)を使用して FGS を開始したアプリに WIU アクセス権が付与されます。

詳しくは、バックグラウンドからフォアグラウンド サービスを開始する場合の制限をご覧ください。

影響を受けるオーディオ API の完全なリスト

音声機能

結果

影響を受ける API

オーディオの再生

再生がミュートされている

例外なし、API からの失敗メッセージなし

AudioTrack.write()

(NDK)AAudioStream_write

Android の OpenSL ES

media3、Exoplayer、Oboe などの再生を管理するクライアントサイドのメディア ライブラリも影響を受ける可能性があります。

音声フォーカス リクエスト

戻り値 AUDIOFOCUS_REQUEST_FAILED

他のアプリの音声再生に影響なし、フォーカスを取得しない

AudioManager.requestAudioFocus()

音量と着信モードの API

着信モードや音量には影響しない(メソッド呼び出しは無視される)

例外なし、API からの失敗メッセージなし

AudioManager.setStreamVolume()

AudioManager.setStreamMute()

AudioManager.adjustStreamVolume()

AudioManager.adjustVolume()

AudioManager.adjustSuggestedStreamVolume()

AudioManager.setRingerMode()