Quản lý cuộc gọi bằng Telecom API

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 ConnectionServiceConnection, 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 ConnectionConnectionService 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

Collection availableBluetoothDevices = mAudioState.getSupportedBluetoothDevices();

Định tuyến âm thanh cuộc gọi

Đị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);