In dieser Anleitung wird beschrieben, wie Sie mit bekannten Android-APIs Audio in Wear OS-Apps wiedergeben können.
Audiogeräte erkennen
Eine Wear OS-App muss zuerst erkennen, ob das Wearable eine geeignete Audioausgabe hat. Wearables haben in der Regel mindestens eine der folgenden Audioausgaben:
AudioDeviceInfo.TYPE_BUILTIN_SPEAKER: auf Geräten mit integriertem LautsprecherAudioDeviceInfo.TYPE_BLUETOOTH_A2DP: wenn ein Bluetooth-Headset gekoppelt und verbunden istAudioDeviceInfo.TYPE_BLE_BROADCAST: wenn ein Gerät der Bluetooth Low Energy (BLE) Broadcast Group gekoppelt und verbunden istAudioDeviceInfo.TYPE_BLE_HEADSET: wenn ein BLE-Headset gekoppelt und verbunden istAudioDeviceInfo.TYPE_BLE_SPEAKER: wenn ein BLE-Lautsprecher gekoppelt und verbunden ist
Im folgenden Beispiel wird die Methode getDevices() mit dem Wert FEATURE_AUDIO_OUTPUT verwendet, um zu prüfen, ob ein Audioausgabetyp verfügbar ist.
private val audioManager: AudioManager by lazy { getSystemService(AUDIO_SERVICE) as AudioManager } fun audioOutputAvailable(type: Int): Boolean { if (!packageManager.hasSystemFeature(PackageManager.FEATURE_AUDIO_OUTPUT)) { return false } return audioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS).any { it.type == type } }
Mit dieser Methode können Sie dann prüfen, ob ein Audioausgabetyp verfügbar ist.
val hasSpeaker = audioOutputAvailable(AudioDeviceInfo.TYPE_BUILTIN_SPEAKER) val hasBluetoothHeadset = audioOutputAvailable(AudioDeviceInfo.TYPE_BLUETOOTH_A2DP) val hasBLEBroadcast = audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_BROADCAST) val hasBLEHeadset = audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_HEADSET) val hasBLESpeaker = audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_SPEAKER)
Für eine optimale Nutzerfreundlichkeit werden Medien nur wiedergegeben, wenn Bluetooth-Headsets oder ‑Lautsprecher mit der Smartwatch verbunden sind.
Bevorzugtes Gerät für die Audioausgabe auswählen
Je nach Anwendungsfall Ihrer App und der Bedeutung von Audio für deren Hauptfunktionen können Sie festlegen, wie Nutzer mit der Audioausgabe Ihrer App interagieren dürfen.
Nutzer darf das Medienausgabegerät auswählen
Ab Wear OS 5 bietet das System eine Benutzeroberfläche, über die Nutzer auswählen können, auf welchem Gerät Medien wiedergegeben werden und Informationen zu den aktuell wiedergegebenen Medieninhalten angezeigt werden.
Wenn Ihre App erkennt, dass kein Bluetooth-Headset verbunden ist, wenn Sie die Audiowiedergabe auf Geräten mit Wear OS 5 oder höher anbieten möchten, richten Sie die Möglichkeit ein, dass der Nutzer direkt zum Medienausgabemenü geht. Auf Geräten, die das Medienausgabemenü nicht unterstützen, rufen Sie die ACTION_BLUETOOTH_SETTINGS-Intent-Aktion auf, die den Nutzer zur Seite „Bluetooth“ in den Systemeinstellungen weiterleitet.
Die Methode launchOutputSelection(), die Teil der Horologist-Bibliothek auf GitHub ist, zeigt, was Sie tun müssen, damit Nutzer ihr Medienausgabegerät auswählen können.
Bluetooth-Headset
Im Gegensatz zu integrierten Lautsprechern, die bei entsprechender Ausstattung des Geräts immer verfügbar sind, kann ein Bluetooth-Headset während der Ausführung einer App gekoppelt oder entkoppelt werden. Wenn für Ihre App ein Headset erforderlich ist, registrieren Sie einen Callback, um zu erkennen, wann der Nutzer ein Bluetooth-Headset über registerAudioDeviceCallback anschließt und trennt:
val audioDeviceCallback = object : AudioDeviceCallback() { override fun onAudioDevicesAdded(addedDevices: Array<out AudioDeviceInfo>?) { super.onAudioDevicesAdded(addedDevices) if (audioOutputAvailable(AudioDeviceInfo.TYPE_BLUETOOTH_A2DP) || audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_BROADCAST) || audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_HEADSET) || audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_SPEAKER) ) { // A Bluetooth or BLE device is connected and available for playback. } } override fun onAudioDevicesRemoved(removedDevices: Array<out AudioDeviceInfo>?) { super.onAudioDevicesRemoved(removedDevices) if (!(audioOutputAvailable(AudioDeviceInfo.TYPE_BLUETOOTH_A2DP)) && !(audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_BROADCAST)) && !(audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_HEADSET)) && !(audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_SPEAKER)) ) { // No Bluetooth or BLE devices are connected anymore. } } } audioManager.registerAudioDeviceCallback(audioDeviceCallback, /*handler=*/ null)
Wenn Ihre App erkennt, dass kein Bluetooth-Headset verbunden ist, und Sie die Audioausgabe bereitstellen möchten, lassen Sie keine Fehlermeldung einblenden. Sorgen Sie stattdessen dafür, dass der Nutzer direkt zu den Bluetooth-Einstellungen gehen kann, um ihm die Verbindung zu erleichtern. Dazu können Sie einen Intent mit ACTION_BLUETOOTH_SETTINGS senden:
fun Context.launchBluetoothSettings(closeOnConnect: Boolean = true) { val intent = with(Intent(Settings.ACTION_BLUETOOTH_SETTINGS)) { addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) putExtra("EXTRA_CONNECTION_ONLY", true) if (closeOnConnect) { putExtra("EXTRA_CLOSE_ON_CONNECT", true) } putExtra("android.bluetooth.devicepicker.extra.FILTER_TYPE", FILTER_TYPE_AUDIO) } startActivity(intent) } internal const val FILTER_TYPE_AUDIO = 1
Integrierte Lautsprecher
Die meisten Wear OS-Geräte haben integrierte Lautsprecher. Wenn Ihre App einen nicht medienbezogenen Anwendungsfall bietet, bei dem Ton verwendet wird, sollten Sie Lautsprecher in Betracht ziehen, um eine zusätzliche Dimension der Interaktion zu ermöglichen. Ein mit Lautsprecher ausgestattetes Wear OS-Gerät kann beispielsweise einen Wecker oder Timer mit einer Audiobenachrichtigung auslösen und Fitness-Apps können den Lautsprecher verwenden, um Trainingsanleitungen zu geben.
Weitere Informationen finden Sie unter WearSpeakerSample.
Audio wiedergeben
Nachdem eine geeignete Audioausgabe erkannt und ausgewählt wurde, erfolgt die Audiowiedergabe auf Wear OS-Geräten genauso wie auf Mobilgeräten oder anderen Geräten. Weitere Informationen finden Sie in der Übersicht über MediaPlayer. Wenn Nutzer einfacher auf erweiterte Funktionen, wie z. B. das Streamen und Herunterladen von Medien, zugreifen können sollen, verwenden Sie ExoPlayer. Bei Audio-Apps sollten Sie sich an die Best Practices halten, z. B. beim Verwalten des Audiofokus.
Unerwünschte Medienwiedergabe über integrierte Lautsprecher verhindern
Bei Medien-Apps können Sie mit den folgenden Schritten verhindern, dass die App versehentlich Medien über die integrierten Lautsprecher der Smartwatch wiedergibt. Die Anleitung variiert je nach Player, der in Ihrer App verwendet wird.
ExoPlayer
Wenn Ihre App ExoPlayer verwendet:
- Rufen Sie beim Erstellen der ExoPlayer-Instanz die Methode
setSuppressPlaybackOnUnsuitableOutput(true)auf:
val exoPlayer = ExoPlayer.Builder(context) .setAudioAttributes(AudioAttributes.DEFAULT, true) .setSuppressPlaybackOnUnsuitableOutput(true) .build()
- Reagieren Sie auf das Ereignis zur Unterdrückung der Wiedergabe, indem Sie den Listener
WearUnsuitableOutputPlaybackSuppressionResolverListenerals Listener der ExoPlayer-Instanz registrieren:
exoPlayer.addListener(WearUnsuitableOutputPlaybackSuppressionResolverListener(context))
Horologist Media-Toolkit
Das Horologist MediaToolkit enthält bereits eine Logik, die eine unbeabsichtigte Medienwiedergabe über die integrierten Lautsprecher der Smartwatch verhindert.
Andere Mediaplayer
- Die Medienwiedergabe sollte erst starten, wenn ein geeignetes Ausgabegerät, z. B. ein Headset oder externe Lautsprecher, mit der Smartwatch verbunden ist. In der folgenden Liste sind geeignete Ausgabegeräte für Medien-Apps aufgeführt:
- Pausieren Sie die Wiedergabe, wenn AudioManager Ihre App darüber informiert, dass ein externes Audioausgabegerät von der Smartwatch getrennt wird.
- Wenn der Nutzer versucht, die Medienwiedergabe zu starten, er aber kein externes Audiogerät verbunden hat, fordern Sie ihn auf, ein Gerät mit seiner Smartwatch zu verbinden.