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 eine geeignete Audioausgabe hat. Wearables haben in der Regel mindestens eine der folgenden Audioausgaben:

  • 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 der Bluetooth Low Energy (BLE) Broadcast Group 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-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:

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

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

  1. Reagieren Sie auf das Ereignis zur Unterdrückung der Wiedergabe, indem Sie den Listener WearUnsuitableOutputPlaybackSuppressionResolverListener als 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