このガイドでは、Telecom API を使用して Bluetooth デバイスの音声をルーティングし、VoIP 通話の接続を設定する方法について説明します。続行する前に、通話アプリを作成するをご覧ください。
ConnectionService
クラスと Connection
クラスを使用すると、音声状態と使用可能な Bluetooth デバイスのリストにアクセスし、選択した Bluetooth デバイスにオーディオをルーティングできます。
VoIP 接続と ConnectionService
Connection
から拡張する VoIPConnection
クラスを作成します。このクラスは、現在の通話の状態を制御します。通話アプリの作成のガイドにあるように、アプリをセルフマネージド アプリにし、VoIP アプリの音声モードを設定します。
Kotlin
class VoIPConnection : Connection() { init { setConnectionProperties(PROPERTY_SELF_MANAGED) setAudioModeIsVoip(true) } }
Java
public class VoIPConnection extends Connection { public VoIPConnection() { setConnectionProperties(PROPERTY_SELF_MANAGED); setAudioModeIsVoip(true); } }
次に、着信または発信が発生したときに、ConnectionService
でこのクラスのインスタンスを返します。
Kotlin
class VoIPConnectionService : ConnectionService() { override fun onCreateOutgoingConnection( connectionManagerPhoneAccount: PhoneAccountHandle, request: ConnectionRequest, ): Connection { return VoIPConnection() } }
Java
public class VoIPConnectionService extends ConnectionService { @Override public Connection onCreateOutgoingConnection(PhoneAccountHandle connectionManagerPhoneAccount, ConnectionRequest request) { return new VoIPConnection(); } }
マニフェストで VoIPConnectionService
クラスを正しく参照していることを確認します。
<service android:name=".voip.TelegramConnectionService" android:permission="android.permission.BIND_TELECOM_CONNECTION_SERVICE">
<intent-filter>
<action android:name="android.telecom.ConnectionService"/>
</intent-filter>
</service>
これらのカスタム Connection
クラスと ConnectionService
クラスを使用すると、通話中に使用するデバイスと音声ルーティングの種類を制御できます。
現在の音声状態を取得する
現在の音声状態を取得するには、getCallAudioState()
を呼び出します。getCallAudioState()
は、デバイスが Bluetooth、受話口、有線またはスピーカーを使用してストリーミングしている場合に返されます。
mAudioState = connection.getCallAudioState()
オン状態の変化
onCallAudioStateChanged()
をオーバーライドして、CallAudioState の変更に登録します。これにより、状態が変更されるとアラートが送信されます。
Kotlin
fun onCallAudioStateChanged(audioState: CallAudioState) { mAudioState = audioState }
Java
@Override public void onCallAudioStateChanged(CallAudioState audioState) { mAudioState = audioState; }
現在のデバイスを取得する
CallAudioState.getActiveBluetoothDevice()
を使用して、現在アクティブなデバイスを取得します。この関数はアクティブな Bluetooth デバイスを返します。
Kotlin
val activeDevice: BluetoothDevice = mAudioState.getActiveBluetoothDevice()
Java
BluetoothDevice activeDevice = mAudioState.getActiveBluetoothDevice();
Bluetooth デバイスを入手する
CallAudioState.getSupportedBluetoothDevices()
を使用して、通話音声ルーティングに使用できる Bluetooth デバイスのリストを取得します。
Kotlin
val availableBluetoothDevices: Collection= mAudioState.getSupportedBluetoothDevices()
Java
CollectionavailableBluetoothDevices = mAudioState.getSupportedBluetoothDevices();
通話の音声をルーティングする
API レベル 28 以降の使用(推奨)
requestBluetoothAudio(BluetoothDevice)
を使用して、利用可能な Bluetooth デバイスに通話音声をルーティングします。
requestBluetoothAudio(availableBluetoothDevices[0]);
API レベル 23 以降の使用
setAudioRoute(int)
を使用してデバイスを指定せずに ROUTE_BLUETOOTH
を有効にします。Android 9 以降では、デフォルトで現在アクティブな Bluetooth デバイスにルーティングされます。
setAudioRoute(CallAudioState.ROUTE_BLUETOOTH);