Hướng dẫn này trình bày cách định tuyến âm thanh cho các thiết bị Bluetooth bằng API Viễn thông và thiết lập kết nối cho các cuộc gọi VoIP. Hãy đọc hướng dẫn Tạo ứng dụng gọi trước khi tiếp tục.
Bằng cách sử dụng các lớp ConnectionService
và Connection
, bạn có thể truy cập vào trạng thái âm thanh và danh sách các thiết bị Bluetooth hiện có, đồng thời có thể định tuyến âm thanh đến một thiết bị Bluetooth đã chọn.
Dịch vụ kết nối và kết nối VoIP
Tạo một lớp VoIPConnection
mở rộng từ Connection
. Lớp này kiểm soát trạng thái của lệnh gọi hiện tại. Như hướng dẫn Tạo ứng dụng gọi, hãy đặt ứng dụng này làm ứng dụng tự quản lý và đặt chế độ âm thanh cho ứng dụng 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); } }
Tiếp theo, hãy trả về một thực thể của lớp này trong ConnectionService
khi có lệnh gọi đến hoặc đi.
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(); } }
Đảm bảo tệp kê khai trỏ chính xác đến lớp 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>
Với các lớp Connection
và ConnectionService
tuỳ chỉnh này, bạn có thể điều khiển thiết bị cũng như loại định tuyến âm thanh mà bạn muốn sử dụng trong khi gọi điện.
Xem trạng thái âm thanh hiện tại
Để biết trạng thái âm thanh hiện tại, hãy gọi getCallAudioState()
.
getCallAudioState()
sẽ được trả về nếu thiết bị đang truyền trực tuyến bằng Bluetooth, Tai nghe, Có dây hoặc Loa.
mAudioState = connection.getCallAudioState()
Khi trạng thái thay đổi
Đăng ký các thay đổi trong CallAudioState bằng cách ghi đè onCallAudioStateChanged()
.
Tính năng này cảnh báo cho bạn về mọi thay đổi đối với trạng thái.
Kotlin
fun onCallAudioStateChanged(audioState: CallAudioState) { mAudioState = audioState }
Java
@Override public void onCallAudioStateChanged(CallAudioState audioState) { mAudioState = audioState; }
Tải thiết bị hiện tại
Lấy thiết bị đang hoạt động bằng CallAudioState.getActiveBluetoothDevice()
.
Hàm này trả về thiết bị Bluetooth đang hoạt động.
Kotlin
val activeDevice: BluetoothDevice = mAudioState.getActiveBluetoothDevice()
Java
BluetoothDevice activeDevice = mAudioState.getActiveBluetoothDevice();
Tải thiết bị Bluetooth
Nhận danh sách các thiết bị Bluetooth có thể dùng để định tuyến âm thanh cuộc gọi bằng CallAudioState.getSupportedBluetoothDevices()
.
Kotlin
val availableBluetoothDevices: Collection= mAudioState.getSupportedBluetoothDevices()
Java
CollectionavailableBluetoothDevices = mAudioState.getSupportedBluetoothDevices();
Định tuyến âm thanh cuộc gọi
Sử dụng API cấp 28 trở lên (nên dùng)
Định tuyến âm thanh cuộc gọi đến một thiết bị Bluetooth hiện có bằng requestBluetoothAudio(BluetoothDevice)
:
requestBluetoothAudio(availableBluetoothDevices[0]);
Sử dụng API cấp 23 trở lên
Bật ROUTE_BLUETOOTH
mà không cần chỉ định thiết bị bằng setAudioRoute(int)
.
Chế độ mặc định này sẽ định tuyến đến các thiết bị Bluetooth hiện tại, đang hoạt động trên Android 9 trở lên.
setAudioRoute(CallAudioState.ROUTE_BLUETOOTH);