Ten przewodnik opisuje, jak używać znanych interfejsów API Androida do odtwarzania dźwięku w aplikacjach na Wear OS.
Wykrywanie urządzeń audio
Aplikacja na Wear OS musi najpierw sprawdzić, czy urządzenie do noszenia ma odpowiednie wyjście audio. Urządzenia do noszenia mają zwykle co najmniej jedno z tych wyjść audio:
AudioDeviceInfo.TYPE_BUILTIN_SPEAKER
: na urządzeniach z wbudowanym głośnikiem.AudioDeviceInfo.TYPE_BLUETOOTH_A2DP
: gdy zestaw słuchawkowy Bluetooth jest sparowany i połączony.AudioDeviceInfo.TYPE_BLE_BROADCAST
: gdy urządzenie z grupą rozgłoszeniową Bluetooth Low Energy (BLE) jest sparowane i połączone.AudioDeviceInfo.TYPE_BLE_HEADSET
: gdy zestaw słuchawkowy BLE jest sparowany i podłączony.AudioDeviceInfo.TYPE_BLE_SPEAKER
: gdy głośnik BLE jest sparowany i połączony.
W przykładzie poniżej użyto metody getDevices()
z wartością FEATURE_AUDIO_OUTPUT
, aby sprawdzić, czy dostępny jest typ wyjścia audio.
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 } }
Następnie możesz użyć tej metody, aby sprawdzić, czy typ wyjścia audio jest dostępny.
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)
Aby zapewnić użytkownikom jak najlepsze wrażenia, odtwarzaj multimedia tylko wtedy, gdy słuchawki lub głośniki Bluetooth są połączone z zegarkiem.
Wybierz preferowane urządzenie do odtwarzania dźwięku
W zależności od przypadku użycia aplikacji i znaczenia dźwięku dla jej podstawowych funkcji wybierz sposób, w jaki użytkownicy będą korzystać z wyjścia audio aplikacji.
Umożliwianie użytkownikowi wyboru urządzenia wyjściowego multimediów
Od Wear OS 5 system udostępnia interfejs, który pozwala użytkownikom wybrać urządzenie, na którym mają być odtwarzane multimedia, oraz wyświetla informacje o aktualnie odtwarzanych treściach.
Jeśli aplikacja wykryje, że nie ma podłączonego zestawu słuchawkowego Bluetooth, gdy chcesz odtwarzać dźwięk na urządzeniach z Wear OS 5 lub nowszym, zaproponuj użytkownikowi przejście bezpośrednio do przełącznika wyjścia multimediów. Na urządzeniach, które nie obsługują przełącznika wyjścia multimediów, wywołaj działanie ACTION_BLUETOOTH_SETTINGS
intencji, które przenosi użytkownika na stronę Bluetooth w ustawieniach systemu.
launchOutputSelection()
Metoda, która jest częścią biblioteki Horologist w GitHubie, pokazuje, jak umożliwić użytkownikom wybór urządzenia wyjściowego.
Zestaw słuchawkowy Bluetooth
W przeciwieństwie do wbudowanych głośników, które są zawsze dostępne, jeśli znajdują się na urządzeniu, zestaw słuchawkowy Bluetooth można sparować lub rozparować podczas działania aplikacji. Jeśli aplikacja wymaga zestawu słuchawkowego, zarejestruj wywołanie zwrotne, aby wykrywać, kiedy użytkownik podłącza i odłącza zestaw słuchawkowy Bluetooth, używając registerAudioDeviceCallback
:
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)
Jeśli aplikacja wykryje, że nie jest podłączony zestaw słuchawkowy Bluetooth, gdy chcesz odtwarzać dźwięk, nie wyświetlaj komunikatu o błędzie. Zamiast tego zaproponuj użytkownikowi przejście bezpośrednio do ustawień Bluetooth, aby ułatwić mu połączenie. Możesz to zrobić, wysyłając intencję z parametrem ACTION_BLUETOOTH_SETTINGS
:
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
Wbudowane głośniki
Większość urządzeń z Wear OS ma wbudowane głośniki. Jeśli Twoja aplikacja oferuje zastosowanie inne niż odtwarzanie multimediów, ale wykorzystuje dźwięk, rozważ użycie głośników, aby zwiększyć zaangażowanie użytkowników. Na przykład urządzenie z Wear OS wyposażone w głośnik może wywoływać alarm zegara lub timera za pomocą powiadomienia dźwiękowego, a aplikacje do fitnessu mogą używać głośnika do przekazywania instrukcji dotyczących ćwiczeń.
Więcej informacji znajdziesz w WearSpeakerSample.
Odtwórz dźwięk
Po wykryciu i wybraniu odpowiedniego wyjścia audio odtwarzanie dźwięku na Wear OS jest takie samo jak na urządzeniach mobilnych i innych. Więcej informacji znajdziesz w omówieniu MediaPlayer. Aby ułatwić sobie dostęp do zaawansowanych funkcji, np. przesyłania strumieniowego i pobierania multimediów, użyj ExoPlayera. Postępuj zgodnie ze sprawdzonymi metodami dotyczącymi aplikacji audio, np. zarządzaj fokusem audio.
Zapobieganie niepożądanemu odtwarzaniu multimediów przez wbudowane głośniki
Aplikacje multimedialne mogą postępować zgodnie z tymi wskazówkami, aby zapobiec przypadkowemu odtwarzaniu multimediów na wbudowanych głośnikach zegarka. Wskazówki różnią się w zależności od odtwarzacza używanego przez aplikację.
ExoPlayer
Jeśli Twoja aplikacja korzysta z ExoPlayera:
- Wywołaj
setSuppressPlaybackOnUnsuitableOutput(true)
metodę podczas tworzenia instancji ExoPlayera:
val exoPlayer = ExoPlayer.Builder(context) .setAudioAttributes(AudioAttributes.DEFAULT, true) .setSuppressPlaybackOnUnsuitableOutput(true) .build()
- Reaguj na zdarzenie wstrzymania odtwarzania, rejestrując detektor jako detektor instancji ExoPlayera:
WearUnsuitableOutputPlaybackSuppressionResolverListener
exoPlayer.addListener(WearUnsuitableOutputPlaybackSuppressionResolverListener(context))
Pakiet materiałów dla mediów dotyczących zegarmistrzostwa
Horologist MediaToolkit zawiera już logikę zapobiegającą niezamierzonemu odtwarzaniu multimediów na wbudowanych głośnikach zegarka.
Inne odtwarzacze multimediów
- Upewnij się, że odtwarzanie dźwięku z multimediów rozpoczyna się tylko wtedy, gdy do zegarka jest podłączone odpowiednie urządzenie wyjściowe, np. słuchawki lub głośniki zewnętrzne. Poniżej znajdziesz listę odpowiednich urządzeń wyjściowych dla aplikacji multimedialnych:
- Wstrzymaj odtwarzanie, jeśli AudioManager powiadomi aplikację, że zewnętrzne urządzenie wyjściowe audio zostało odłączone od zegarka.
- Gdy użytkownik spróbuje rozpocząć odtwarzanie multimediów, ale nie podłączy zewnętrznego urządzenia audio, poproś go o podłączenie urządzenia do zegarka.