В этом руководстве рассказывается, как маршрутизировать аудио для устройств Bluetooth с помощью Telecom API и настраивать подключение для VoIP-вызовов. Прежде чем продолжить, ознакомьтесь с руководством Как создать приложение для звонков.
С помощью классов ConnectionService и Connection можно получить доступ к состоянию аудио и списку доступных устройств Bluetooth, а также направить аудио на выбранное устройство Bluetooth.
Подключение VoIP и ConnectionService
Создайте класс VoIPConnection, расширяющий Connection. Этот класс управляет состоянием текущего вызова. Как указано в руководстве Создание приложения для звонков, сделайте это приложение самоуправляемым и задайте аудиорежим для приложения 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()
При изменении состояния
Подпишитесь на изменения в CallAudioState, переопределив onCallAudioStateChanged().
Это позволяет вам узнавать о любых изменениях в состоянии.
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
Получите список устройств Bluetooth, доступных для маршрутизации аудиовызовов, с помощью CallAudioState.getSupportedBluetoothDevices().
Kotlin
val availableBluetoothDevices: Collection= mAudioState.getSupportedBluetoothDevices()
Java
CollectionavailableBluetoothDevices = mAudioState.getSupportedBluetoothDevices();
Маршрутизация звука вызова
Использование API уровня 28 и выше (рекомендуется)
Перенаправьте аудиовызов на доступное устройство Bluetooth с помощью requestBluetoothAudio(BluetoothDevice).
requestBluetoothAudio(availableBluetoothDevices[0]);
Использование API уровня 23 и выше
Включите ROUTE_BLUETOOTH, не указывая устройство с помощью setAudioRoute(int).
По умолчанию маршрутизация выполняется на текущие активные устройства Bluetooth на Android 9 и более поздних версиях.
setAudioRoute(CallAudioState.ROUTE_BLUETOOTH);