Mantieni tutto organizzato con le raccolte
Salva e classifica i contenuti in base alle tue preferenze.
Questa guida riguarda le applicazioni di comunicazione, come Voice over Internet Protocol (VoIP), che desiderano gestire autonomamente l'audio e lo stato del dispositivo udibile.
Registra callback audio
Innanzitutto, crea un AudioDeviceCallback, che invia una notifica alla tua app quando i dispositivi audio si connettono o si disconnettono dal dispositivo.
L'ascolto di quando un dispositivo di comunicazione è stato modificato consente all'app di sapere quando è stato applicato il routing e il dispositivo selezionato è attivo.
Utilizza getAvailableCommuncationDevices() per vedere quali dispositivi sono disponibili per una chiamata VoIP. Usa AudioDeviceInfo per verificare se il dispositivo è un visore BLE. In questo esempio viene cercato il primo dispositivo che supporta BLE Audio, ma potresti anche prendere in considerazione l'idea di trovare tutti i dispositivi supportati e di consentire agli utenti di scegliere.
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<AudioDeviceInfo> 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;
}
}
Imposta dispositivo di comunicazione
Dopo aver trovato un dispositivo compatibile, usa setCommunicationDevice per impostare il dispositivo a cui vuoi indirizzare. La verifica dei risultati indica alla tua app se Gestione audio sta tentando di configurare il dispositivo o se si è verificato un errore.
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)
Ora che il dispositivo BLE Audio è stato configurato, quando effettui una chiamata, lo stream audio avrà il routing audio corretto.
Terminare la sessione
Dopo che l'app termina una chiamata o una sessione, cancella i dati del dispositivo di comunicazione attivo. Questo contribuisce a garantire all'utente un'ottima esperienza quando si sposta tra applicazioni diverse.
Kotlin
// Clear the selection, ready for next call
audioManager.clearCommunicationDevice()
Java
// Clear the selection, ready for next call
audioManager.clearCommunicationDevice();
I campioni di contenuti e codice in questa pagina sono soggetti alle licenze descritte nella Licenza per i contenuti. Java e OpenJDK sono marchi o marchi registrati di Oracle e/o delle sue società consociate.
Ultimo aggiornamento 2025-08-13 UTC.
[[["Facile da capire","easyToUnderstand","thumb-up"],["Il problema è stato risolto","solvedMyProblem","thumb-up"],["Altra","otherUp","thumb-up"]],[["Mancano le informazioni di cui ho bisogno","missingTheInformationINeed","thumb-down"],["Troppo complicato/troppi passaggi","tooComplicatedTooManySteps","thumb-down"],["Obsoleti","outOfDate","thumb-down"],["Problema di traduzione","translationIssue","thumb-down"],["Problema relativo a esempi/codice","samplesCodeIssue","thumb-down"],["Altra","otherDown","thumb-down"]],["Ultimo aggiornamento 2025-08-13 UTC."],[],[],null,["# Audio Manager self-managed call guide\n\nThis guide covers communication applications, such as Voice over Internet Protocol (VoIP), that want to self-manage their audio and hearable device state.\n| **Note:** Starting in Android 13 (API level 33), applications must migrate from [`AudioManager#startBluetoothSco()`](/reference/android/media/AudioManager#startBluetoothSco()) to [`AudioManager#setCommunicationDevice()`](/reference/android/media/AudioManager#setCommunicationDevice(android.media.AudioDeviceInfo)) to support upcoming BLE audio headsets. This change is backward-compatible with Hands-Free Profile (HFP) devices.\n\nRegister audio callback\n-----------------------\n\nFirst, create an `AudioDeviceCallback`, which notifies your app when audio devices connect or disconnect from the device. \n\n### Kotlin\n\n```kotlin\nval audioDeviceCallback: AudioDeviceCallback = object : AudioDeviceCallback() {\n override fun onAudioDevicesAdded(addedDevices: Array) {}\n override fun onAudioDevicesRemoved(removedDevices: Array) {}\n}\n\naudioManager.registerAudioDeviceCallback(audioDeviceCallback)\n```\n\n### Java\n\n```java\nfinal AudioDeviceCallback audioDeviceCallback = new AudioDeviceCallback() {\n @Override\n public void onAudioDevicesAdded(AudioDeviceInfo[] addedDevices) {\n }\n\n @Override\n public void onAudioDevicesRemoved(AudioDeviceInfo[] removedDevices) {\n // Handle device removal\n }\n};\n\naudioManager.registerAudioDeviceCallback(audioDeviceCallback);\n```\n\nCheck for active communication device\n-------------------------------------\n\nThe audio manager lets you know which communication device is currently active. \n\n### Kotlin\n\n```kotlin\nval currentCommunicationDevice: AudioDeviceInfo? = audioManager.communicationDevice\n```\n\n### Java\n\n```java\nAudioDeviceInfo currentCommunicationDevice = audioManager.getCommunicationDevice();\n```\n\nListening for when a communication device has changed lets your app know when routing is applied and the device that you selected is active. \n\n### Kotlin\n\n```kotlin\nval listener =\n OnCommunicationDeviceChangedListener { device -\u003e // Handle changes\n currentCommunicationDevice = device\n }\naudioManager.addOnCommunicationDeviceChangedListener(executor, listener)\n```\n\n### Java\n\n```java\nAudioManager.OnCommunicationDeviceChangedListener listener = \n new AudioManager.OnCommunicationDeviceChangedListener() {\n @Override\n void onCommunicationDeviceChanged(AudioDeviceInfo device) {\n // Handle changes\n currentCommunicationDevice = device;\n }\n};\nAudioManager.addOnCommunicationDeviceChangedListener(executor, listener);\n```\n\nFind BLE audio device\n---------------------\n\nUse [`getAvailableCommuncationDevices()`](/reference/android/media/AudioManager#getAvailableCommunicationDevices()) to see which devices are available for a VoIP call. Use `AudioDeviceInfo` to see if the device is a BLE headset. This example looks for the first device that supports BLE Audio, but you might also consider finding all supported devices and allowing users to choose. \n\n### Kotlin\n\n\n // Get list of currently available devices\n val devices = audioManager.availableCommunicationDevices\n\n // User choose one of the devices, let's say, TYPE_BLE_HEADSET\n val userSelectedDeviceType = AudioDeviceInfo.TYPE_BLE_HEADSET\n\n //for the device from the list\n var selectedDevice: AudioDeviceInfo? = null\n for (device in devices) {\n if (device.type == userSelectedDeviceType) {\n selectedDevice = device\n break\n }\n }\n\n### Java\n\n\n // Get list of currently available devices\n List\u003cAudioDeviceInfo\u003e devices = audioManager.getAvailableCommunicationDevices();\n\n // User choose one of the devices, for example, TYPE_BLE_HEADSET\n int userSelectedDeviceType = AudioDeviceInfo.TYPE_BLE_HEADSET;\n\n // Filter for the device from the list\n AudioDeviceInfo selectedDevice = null;\n for (AudioDeviceInfo device : devices) {\n if (device.getType() == userSelectedDeviceType) {\n selectedDevice = device;\n break;\n }\n }\n\nSet communication device\n------------------------\n\nAfter you find a compatible device, use `setCommunicationDevice` to set the device you wish to route to. Checking the result informs your app if the audio manager is trying to set the device or if it encountered an error. \n\n### Kotlin\n\n\n val result = audioManager.setCommunicationDevice(selectedDevice)\n if (!result) {\n // Handle error.\n }\n // Wait for currentCommunicationDevice to become selectedDevice with a timeout (e.g. 30s)\n\n### Java\n\n\n boolean result = audioManager.setCommunicationDevice(selectedDevice);\n if (!result) {\n // Handle error.\n }\n // Wait for currentCommunicationDevice to become selectedDevice with a timeout (e.g. 30s)\n\n| **Note:** Once you set a communication device, wait a maximum of 30 seconds. Unless an error occurs, `AudioDeviceCallback` is called within 30 seconds. If an error occurs, call `clearCommuncationDevice()`, and then call `setCommunicationDevice()`.\n\nNow that the BLE Audio device has been set, when placing a call, the audio stream will have the correct audio routing.\n\nEnd the session\n---------------\n\nAfter your app finishes a call or session, clear the active communication device. This helps ensure the user has a great experience when moving between different applications. \n\n### Kotlin\n\n\n // Clear the selection, ready for next call\n audioManager.clearCommunicationDevice()\n\n### Java\n\n\n // Clear the selection, ready for next call\n audioManager.clearCommunicationDevice();"]]