Telecom API を使用して通話を管理する

このガイドでは、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

Collection availableBluetoothDevices = mAudioState.getSupportedBluetoothDevices();

通話の音声をルーティングする

requestBluetoothAudio(BluetoothDevice) を使用して、利用可能な Bluetooth デバイスに通話音声をルーティングします。

requestBluetoothAudio(availableBluetoothDevices[0]);

API レベル 23 以降の使用

setAudioRoute(int) を使用してデバイスを指定せずに ROUTE_BLUETOOTH を有効にします。Android 9 以降では、デフォルトで現在アクティブな Bluetooth デバイスにルーティングされます。

setAudioRoute(CallAudioState.ROUTE_BLUETOOTH);