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

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

Android 17 で実行され、これらのバックグラウンドでの音声操作を行うすべてのアプリは、表示されるアクティビティがあるか、SHORT_SERVICE 以外のタイプのフォアグラウンド サービスを実行している必要があります。これは、アプリが API レベル 37 を対象としているかどうかに関係なく適用されます。

アプリが Android 17(API レベル 37)を対象としている場合は、追加の制限があります。アプリがバックグラウンドで実行されている場合、アプリは 使用中の機能(WIU)を備えたフォアグラウンド サービスを実行する必要があります(フォアグラウンド サービスは、ユーザーが開始した操作に応じて開始された場合、またはアプリがユーザーに表示されている場合に、WIU 機能が付与されます)。 ただし、アプリに正確なアラーム権限が付与されていて、 属性を持つ音声ストリームを変更している場合は、WIU 機能の要件が免除されます。USAGE_ALARM

アプリが有効なライフサイクルにないときにアプリが音声 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 やユニバーサル メディア オブジェクトの再生ボタンなどを使用して明示的に再生を再開すると、音声再生を開始するインテントが戻り、新たに FGS が開始されます。

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

変更のテスト

Android 17 以降(ベータ版 3 以降)を実行しているアプリでアプリの準拠をテストするには、次の ADB コマンドを実行します。

adb shell cmd audio set-enable-hardening <enable|disable|throw>

このコマンドには次のオプションがあります。

  • enable: すべてのアプリに対して音声強化の制限をすべて有効にします。アプリが Android 17(API レベル 37)を対象としているかどうかに関係なく、WIU フォアグラウンド サービスの要件が適用されます。また、アプリがアラーム ストリームを変更していて、正確なアラーム権限を持っている場合でも、要件が適用されます。

  • disable: 音声強化の制限をすべて無効にします。

  • throw: enable と同様に、すべてのアプリに対して音声強化の制限をすべて有効にします。また、このフラグを使用すると、音量とフォーカスの操作で IllegalStateException がスローされるため、大きな障害が発生します。音声再生の場合、書き込みメソッドはエラーコードを永続的に返します。明示的な書き込みのない再生モードでは、アプリがクラッシュします。

adb dumpsys audio または logcat を使用して、音声強化の適用によりアプリでサイレント エラーが発生したかどうかを確認します。発生した場合は、パッケージ名の前に AudioHardening が付いたエントリが表示されます。メッセージに level: full が含まれている場合、アプリはフォアグラウンド サービスを実行していますが、サービスには使用中の機能がありません。メッセージに level: partial が含まれている場合、アプリはフォアグラウンド サービスをまったく実行していません。

使用中の機能を持つ FGS について

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

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

参考資料を以下に示します。

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

影響を受ける音声 API の完全なリスト

音声機能

結果

影響を受ける API

音声再生

再生がミュートされる

例外なし、API からエラー メッセージは提供されない

AudioTrack.write()

(NDK) AAudioStream_write

OpenSL ES for Android

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

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

AUDIOFOCUS_REQUEST_FAILED を返す

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

AudioManager.requestAudioFocus()

音量と着信モードの API

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

例外なし、API からエラー メッセージは提供されない

AudioManager.setStreamVolume()

AudioManager.setStreamMute()

AudioManager.adjustStreamVolume()

AudioManager.adjustVolume()

AudioManager.adjustSuggestedStreamVolume()

AudioManager.setRingerMode()