Hướng dẫn cuộc gọi tự quản lý trong Trình quản lý âm thanh

Hướng dẫn này đề cập đến những ứng dụng giao tiếp như Truyền giọng nói trên giao thức Internet (VoIP) muốn tự quản lý trạng thái âm thanh và trạng thái của thiết bị có thể nghe được.

Đăng ký lệnh gọi lại âm thanh

Trước tiên, hãy tạo một AudioDeviceCallback để thông báo cho ứng dụng của bạn khi các thiết bị âm thanh kết nối hoặc ngắt kết nối khỏi thiết bị đó.

Kotlin

val audioDeviceCallback: AudioDeviceCallback = object : AudioDeviceCallback() {
  override fun onAudioDevicesAdded(addedDevices: Array) {}
  override fun onAudioDevicesRemoved(removedDevices: Array) {}
}

audioManager.registerAudioDeviceCallback(audioDeviceCallback)

Java

final AudioDeviceCallback audioDeviceCallback = new AudioDeviceCallback() {
  @Override
  public void onAudioDevicesAdded(AudioDeviceInfo[] addedDevices) {
  }

  @Override
  public void onAudioDevicesRemoved(AudioDeviceInfo[] removedDevices) {
    // Handle device removal
  }
};

audioManager.registerAudioDeviceCallback(audioDeviceCallback);

Kiểm tra thiết bị giao tiếp đang hoạt động

Trình quản lý âm thanh cho bạn biết thiết bị giao tiếp nào hiện đang hoạt động.

Kotlin

val currentCommunicationDevice: AudioDeviceInfo? = audioManager.communicationDevice

Java

AudioDeviceInfo currentCommunicationDevice = audioManager.getCommunicationDevice();

Lắng nghe thời điểm một thiết bị giao tiếp thay đổi để cho ứng dụng của bạn biết thời điểm áp dụng chế độ định tuyến và thiết bị bạn chọn đang hoạt động.

Kotlin

val listener =
  OnCommunicationDeviceChangedListener { device -> // Handle changes
    currentCommunicationDevice = device
  }
audioManager.addOnCommunicationDeviceChangedListener(executor, listener)

Java

AudioManager.OnCommunicationDeviceChangedListener listener = 
      new AudioManager.OnCommunicationDeviceChangedListener() {
  @Override
  void onCommunicationDeviceChanged(AudioDeviceInfo device) {
      // Handle changes
      currentCommunicationDevice = device;
  }
};
AudioManager.addOnCommunicationDeviceChangedListener(executor, listener);

Tìm thiết bị âm thanh BLE

Hãy dùng getAvailableCommuncationDevices() để xem thiết bị nào hỗ trợ cuộc gọi VoIP. Sử dụng AudioDeviceInfo để xem thiết bị có phải là tai nghe BLE hay không. Ví dụ này tìm thiết bị đầu tiên hỗ trợ Âm thanh BLE, nhưng bạn cũng có thể cân nhắc việc tìm tất cả thiết bị được hỗ trợ và cho phép người dùng lựa chọn.

Kotlin


// Get list of currently available devices
val devices = audioManager.availableCommunicationDevices

// User choose one of the devices, let's say, TYPE_BLE_HEADSET
val userSelectedDeviceType = AudioDeviceInfo.TYPE_BLE_HEADSET

//for the device from the list
var selectedDevice: AudioDeviceInfo? = null
for (device in devices) {
  if (device.type == userSelectedDeviceType) {
    selectedDevice = device
    break
  }
}

Java


// Get list of currently available devices
List devices = audioManager.getAvailableCommunicationDevices();

// User choose one of the devices, for example, TYPE_BLE_HEADSET
int userSelectedDeviceType = AudioDeviceInfo.TYPE_BLE_HEADSET;

// Filter for the device from the list
AudioDeviceInfo selectedDevice = null;
for (AudioDeviceInfo device : devices) {
    if (device.getType() == userSelectedDeviceType) {
        selectedDevice = device;
        break;
    }
}

Đặt thiết bị liên lạc

Sau khi bạn tìm thấy một thiết bị tương thích, hãy dùng setCommunicationDevice để đặt thiết bị mà bạn muốn chuyển đến. Việc kiểm tra kết quả sẽ thông báo cho ứng dụng của bạn biết liệu trình quản lý âm thanh có đang cố đặt thiết bị hay không hoặc thiết bị có gặp lỗi hay không.

Kotlin


val result = audioManager.setCommunicationDevice(selectedDevice)
if (!result) {
  // Handle error.
}
// Wait for currentCommunicationDevice to become selectedDevice with a timeout (e.g. 30s)

Java


boolean result = audioManager.setCommunicationDevice(selectedDevice);
if (!result) {
  // Handle error.
}
// Wait for currentCommunicationDevice to become selectedDevice with a timeout (e.g. 30s)

Hiện tại, thiết bị Âm thanh BLE đã được thiết lập, nên khi bạn gọi điện, luồng âm thanh sẽ có chế độ định tuyến âm thanh chính xác.

Kết thúc phiên

Sau khi ứng dụng của bạn kết thúc một cuộc gọi hoặc phiên, hãy xoá thiết bị giao tiếp đang hoạt động. Điều này giúp đảm bảo người dùng có trải nghiệm tốt khi di chuyển giữa các ứng dụng.

Kotlin


// Clear the selection, ready for next call
audioManager.clearCommunicationDevice()

Java


// Clear the selection, ready for next call
audioManager.clearCommunicationDevice();