В этом руководстве описывается, как маршрутизировать звук для устройств 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= mAudioState.getSupportedBluetoothDevices()
Ява
CollectionavailableBluetoothDevices = mAudioState.getSupportedBluetoothDevices();
Направить звук вызова
Использование уровня API 28 и выше (рекомендуется)
Направьте звук вызова на доступное устройство Bluetooth с помощью requestBluetoothAudio(BluetoothDevice)
:
requestBluetoothAudio(availableBluetoothDevices[0]);
Использование API уровня 23 и выше
Включите ROUTE_BLUETOOTH
без указания устройства с помощью setAudioRoute(int)
. По умолчанию используется маршрутизация к текущим активным устройствам Bluetooth на Android 9 и выше.
setAudioRoute(CallAudioState.ROUTE_BLUETOOTH);