מדריך לשיחות בניהול עצמי באמצעות מנהל האודיו

מדריך זה עוסק באפליקציות תקשורת, כמו פרוטוקול העברת קול באינטרנט (VoIP), שרוצים לנהל באופן עצמאי את מצב האודיו ומכשיר השמיעה שלהם.

רישום קריאה חוזרת באודיו

קודם כול צריך ליצור AudioDeviceCallback, שיקבל התראה לאפליקציה כשמכשירי האודיו מתחברים למכשיר או מתנתקים ממנו.

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

כדאי לבדוק אם יש מכשיר תקשורת פעיל

מנהל האודיו מאפשר לכם לדעת איזה מכשיר תקשורת פעיל כרגע.

Kotlin

val currentCommunicationDevice: AudioDeviceInfo? = audioManager.communicationDevice

Java

AudioDeviceInfo currentCommunicationDevice = audioManager.getCommunicationDevice();

לאחר שינוי מכשיר התקשורת, האפליקציה תדע מתי הוחל הניתוב והמכשיר שבחרת פעיל.

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

איתור מכשיר אודיו באמצעות BLE

בעזרת getAvailableCommuncationDevices() אפשר לראות אילו מכשירים זמינים לשיחת VoIP. אפשר להשתמש ב-AudioDeviceInfo כדי לבדוק אם המכשיר הוא אוזניות מסוג BLE. בדוגמה הזו אנחנו מחפשים את המכשיר הראשון שתומך ב-BLE Audio, אבל כדאי גם לאתר את כל המכשירים הנתמכים ולאפשר למשתמשים לבחור.

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;
    }
}

הגדרה של מכשיר תקשורת

אחרי שמוצאים מכשיר תואם, אפשר להשתמש ב-setCommunicationDevice כדי להגדיר את המכשיר שאליו רוצים לנתב. כשבודקים את התוצאה, המערכת מיידעת את האפליקציה אם מנהל האודיו מנסה להגדיר את המכשיר או אם הוא נתקל בשגיאה.

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)

עכשיו, אחרי שמכשיר BLE Audio הוגדר, כשמתקשרים, ניתוב האודיו של שידור האודיו נכון.

סיום הסשן

אחרי שהאפליקציה מסיימת שיחה או סשן, מוחקים את מכשיר התקשורת הפעיל. כך ניתן להבטיח שהמשתמשים ייהנו מחוויה מעולה במעבר בין אפליקציות שונות.

Kotlin


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

Java


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