Android 14 の VoIP アプリ向けオーディオ ルーティング API の更新

Android 14 では、補聴器を含む Bluetooth LE Audio(LEA)デバイスのオーディオ ルーティング動作に対するユーザー エクスペリエンスの変更に伴い、API が更新されました。この変更は、VoIP アプリが音声出力の選択を管理する方法に影響しました。このドキュメントでは、デベロッパーがこれらの変更に VoIP アプリを適応させ、シームレスなユーザー エクスペリエンスを実現するために必要な情報を提供します。

Android 14 での動作の変更

  • LEA デバイスのルーティング: Google Pixel と AOSP で LEA デバイスがデフォルトで有効になりました。ただし、LEA デバイスを音声出力として積極的に認識して選択するには、API レベル 31 で導入された新しい API を使用する必要があります。
  • 補聴器のルーティング: 以前は、ユーザーがイヤホンを明示的に選択した場合でも、音声は常にデフォルトで補聴器に送信されていました。Android 14 では、補聴器が利用可能な音声出力オプションの 1 つとして表示されるようになりました。このオプションを使用するには、ユーザーによる明示的な選択が必要です。

変更の理由

  • Android 12 より前は、通話で補聴器を明示的に使用する API がないため、接続時に音声が常にデフォルトで補聴器に設定されていました。
  • これにより、補聴器を切断せずに補聴器からイヤホンに切り替えることが困難でした。
  • 同じ問題は Bluetooth LE Audio ヘッドセットに当てはまります。

これらの課題に対処するため、Android 14 では、VoIP アプリでオーディオ ルーティングをより細かく制御し、Bluetooth アクセサリ間で一貫した動作を実現するための変更が導入されました。

Android 14 の主な変更点

  • ルート選択用の汎用 API: Android 12 で AudioManager.setCommunicationDevice が導入され、補聴器や LEA デバイスなどのオーディオ ルートをアプリで指定できるようになりました。ただし、Android 12 と 13 では、補聴器がデバイスとして表示されないため、この API の有用性が制限されていました。
  • 補聴器の可視性: Android 14 では、補聴器がデバイスとして表示されるようになりました。これにより、アプリで UI 要素を提供して、ユーザーが好みの音声出力を選択できるようになりました。
  • API の非推奨: Android 14 では、オーディオ ルーティングに関連するいくつかの API が非推奨になりました。デベロッパーは、オーディオ出力の選択を効果的に管理するために、API レベル 31 で導入された新しい API に移行する必要があります。

デベロッパーに必要な操作

  • 強く推奨: Telecom Jetpack ライブラリに移行します。可能であれば、VoIP アプリを Telecom Jetpack ライブラリに移行して、音声ルーティング管理を効率化します。
  • 移行が不可能な場合は、setCommunicationDevice() または最新の API(以下に記載)を使用します。

非推奨の API とその代替 API

Android 14 で非推奨 新しい API
AudioManager.isBluetoothScoOn() AudioManager.getCommunicationDevice()
AudioManager.isSpeakerphoneOn()
AudioManager.setSpeakerphoneOn() AudioManager.setCommunicationDevice()
AudioManager.startBluetoothSco()
AudioManager.stopBluetoothSco() AudioManager.clearCommunicationDevice()
Connection.getCallAudioState() Jetpack:
CallControlScope.getAvailableEndpoints()
CallControlScope.getCurrentCallEndpoint()
CallControlScope#isMuted()

プラットフォーム:
CallEventCallback.onAvailableCallEndpointsChanged()
CallEventCallback.onCallEndpointChanged()
CallEventCallback.onMuteStateChanged()
Connection.onCallAudioStateChanged()
Connection.requestBluetoothAudio() Jetpack:
CallControlScope#requestEndpointChange()

プラットフォーム:
CallControl#requestCallEndpointChange()
Connection.setAudioRoute()