Audio auf Wearables abspielen

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 einen geeigneten Audioausgang hat. Wearables haben in der Regel mindestens einen der folgenden Audioausgänge:

  • AudioDeviceInfo.TYPE_BUILTIN_SPEAKER: auf Geräten mit integriertem Lautsprecher.
  • AudioDeviceInfo.TYPE_BLUETOOTH_A2DP: wenn ein Bluetooth-Headset gekoppelt und verbunden ist.
  • AudioDeviceInfo.TYPE_BLE_BROADCAST: wenn ein Gerät einer Bluetooth Low Energy-Broadcastgruppe (BLE) gekoppelt und verbunden ist.
  • AudioDeviceInfo.TYPE_BLE_HEADSET: wenn ein BLE-Headset gekoppelt und verbunden ist.
  • AudioDeviceInfo.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-Kopfhörer 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 die Hauptfunktionen können Sie festlegen, wie Nutzer mit der Audioausgabe Ihrer App interagieren.

Nutzer darf das Media-Ausgabegerä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 auf dem 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, bieten Sie an, den Nutzer direkt zur Media-Output-Auswahl weiterzuleiten. Auf Geräten, die die Media-Ausgabesteuerung nicht unterstützen, rufen Sie die ACTION_BLUETOOTH_SETTINGS-Intent-Aktion auf, die den Nutzer zur Bluetooth-Seite in den Systemeinstellungen weiterleitet.

Die launchOutputSelection()-Methode, die Teil der Horologist-Bibliothek auf GitHub ist, zeigt, wie Nutzer ihr Media-Ausgabegerät auswählen können.

Bluetooth-Headset

Im Gegensatz zu integrierten Lautsprechern, die immer verfügbar sind, wenn sie auf dem Gerät vorhanden 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, wenn Sie Audioausgabe bereitstellen möchten, zeigen Sie keine Fehlermeldung an. Bieten Sie stattdessen an, den Nutzer direkt zu den Bluetooth-Einstellungen weiterzuleiten, 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 mediabezogenen 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 du eine geeignete Audioausgabe erkannt und ausgewählt hast, ist 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. ExoPlayer bietet einen einfacheren Zugriff auf erweiterte Funktionen wie das Streamen und Herunterladen von Medien. Halten Sie sich an die Best Practices für Audio-Apps, z. B. Audio-Fokus verwalten.

Unerwünschte Medienwiedergabe über integrierte Lautsprecher verhindern

Media-Apps können diese Anleitung befolgen, um zu 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:

  1. Rufen Sie die setSuppressPlaybackOnUnsuitableOutput(true)-Methode beim Erstellen der ExoPlayer-Instanz auf:

val exoPlayer = ExoPlayer.Builder(context)
    .setAudioAttributes(AudioAttributes.DEFAULT, true)
    .setSuppressPlaybackOnUnsuitableOutput(true)
    .build()

  1. Reagiere auf das Ereignis zur Unterdrückung der Wiedergabe, indem du WearUnsuitableOutputPlaybackSuppressionResolverListener listener als Listener der ExoPlayer-Instanz registrierst:

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