Управляйте звонками с помощью Telecom API

В этом руководстве описывается, как маршрутизировать звук для устройств Bluetooth с помощью Telecom API и настроить соединение для вызовов VoIP. Прежде чем продолжить, прочтите руководство по созданию приложения для звонков .

Используя классы ConnectionService и Connection , вы можете получить доступ к состоянию звука и списку доступных устройств Bluetooth, а также направить звук на выбранное устройство Bluetooth.

VoIP-соединение и ConnectionService

Создайте класс VoIPConnection , наследуемый от Connection . Этот класс контролирует состояние текущего вызова. Как указано в руководстве по созданию приложения для звонков , сделайте это приложение самоуправляемым и установите аудиорежим для приложения VoIP.

class VoIPConnection : Connection() {
 
init {
    setConnectionProperties
(PROPERTY_SELF_MANAGED)
    setAudioModeIsVoip
(true)
 
}
}
public class VoIPConnection extends Connection {
 
public VoIPConnection() {
    setConnectionProperties
(PROPERTY_SELF_MANAGED);
    setAudioModeIsVoip
(true);
 
}
}

Затем верните экземпляр этого класса в ConnectionService при возникновении входящего или исходящего вызова.

class VoIPConnectionService : ConnectionService() {
 
override fun onCreateOutgoingConnection(
    connectionManagerPhoneAccount
: PhoneAccountHandle,
    request
: ConnectionRequest,
 
): Connection {
   
return VoIPConnection()
 
}
}
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()

При изменении состояния

Подпишитесь на изменения в CallAudioState, переопределив onCallAudioStateChanged() . Это предупреждает вас о любых изменениях в состоянии.

fun onCallAudioStateChanged(audioState: CallAudioState) {
  mAudioState
= audioState
}
@Override
public void onCallAudioStateChanged(CallAudioState audioState) {
  mAudioState
= audioState;
}

Получить текущее устройство

Получите текущее активное устройство с помощью CallAudioState.getActiveBluetoothDevice() . Эта функция возвращает активное устройство Bluetooth.

val activeDevice: BluetoothDevice = mAudioState.getActiveBluetoothDevice()
BluetoothDevice activeDevice = mAudioState.getActiveBluetoothDevice();

Получить устройства Bluetooth

Получите список устройств Bluetooth, доступных для маршрутизации звука вызовов, с помощью CallAudioState.getSupportedBluetoothDevices() .

val availableBluetoothDevices: Collection
Collection

Направить звук вызова

Направьте звук вызова на доступное устройство Bluetooth с помощью requestBluetoothAudio(BluetoothDevice) :

requestBluetoothAudio(availableBluetoothDevices[0]);

Использование API уровня 23 и выше

Включите ROUTE_BLUETOOTH без указания устройства с помощью setAudioRoute(int) . По умолчанию используется маршрутизация к текущим активным устройствам Bluetooth на Android 9 и выше.

setAudioRoute(CallAudioState.ROUTE_BLUETOOTH);