Odtwarzanie dźwięku na urządzeniach do noszenia

Ten przewodnik opisuje, jak aplikacje na Wear OS mogą odtwarzać dźwięk za pomocą znanych interfejsów API Androida.

Wykrywanie urządzeń audio

Aplikacja na Wear OS musi najpierw wykryć, czy urządzenie do noszenia ma odpowiednie wyjście audio. Deweloperzy mogą oczekiwać, że urządzenia do noszenia będą miały co najmniej jedno z tych wyjść audio:

W przykładzie poniżej aplikacja używa metody getDevices() w połączeniu z wartością FEATURE_AUDIO_OUTPUT, aby wyliczyć wszystkie wyjścia audio.

AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);

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 }
}

// True if the device has a speaker
audioOutputAvailable(AudioDeviceInfo.TYPE_BUILTIN_SPEAKER)

// True if a Bluetooth headset is paired and connected
audioOutputAvailable(AudioDeviceInfo.TYPE_BLUETOOTH_A2DP)

// True if a BLE broadcast group device is paired and connected
audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_BROADCAST)

// True if a BLE headset is paired and connected
audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_HEADSET)

// True if a BLE speaker is paired and connected
audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_SPEAKER)

Aby zapewnić użytkownikom jak najlepsze wrażenia, aplikacja powinna odtwarzać multimedia tylko wtedy, gdy do zegarka są podłączone słuchawki lub głośniki Bluetooth.

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 podstawowego działania wybierz sposób, w jaki użytkownicy mają 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 intencji ACTION_BLUETOOTH_SETTINGS, które przenosi użytkownika na stronę Bluetooth w ustawieniach systemu.

Metoda launchOutputSelection(), która jest częścią biblioteki Horologist w GitHubie, pokazuje, jak umożliwić użytkownikowi 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że być sparowany lub rozparowany 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:

audioManager.registerAudioDeviceCallback(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.
        }
    }
}, 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ń Bluetootha, aby ułatwić mu połączenie. Możesz to zrobić, wysyłając intencję z parametrem ACTION_BLUETOOTH_SETTINGS:

  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)
      putExtra("EXTRA_CLOSE_ON_CONNECT", true)
      putExtra("android.bluetooth.devicepicker.extra.FILTER_TYPE", 1)
  }
  startActivity(intent)
  

Wbudowane głośniki

Większość urządzeń z Wear OS ma wbudowane głośniki. Jeśli Twoja aplikacja oferuje zastosowanie inne niż multimedialne, które obejmuje dźwięk, możesz użyć głośników, aby zwiększyć zaangażowanie użytkownika. Na przykład urządzenie z Wear OS wyposażone w głośnik może włączać alarm zegara lub minutnika wraz z powiadomieniem dźwiękowym, a aplikacje do fitnessu mogą używać głośnika do przekazywania instrukcji dotyczących ćwiczeń.

Uwaga: wbudowane głośniki nie zapewniają najlepszych wrażeń podczas słuchania treści multimedialnych, ponieważ nie są do tego przeznaczone.

Szczegółowe informacje znajdziesz w  WearSpeakerSample.

Odtwórz dźwięk

Po wykryciu i wybraniu odpowiedniego wyjścia audio proces odtwarzania dźwięku na Wear OS jest taki sam jak na urządzeniach mobilnych i innych. Więcej informacji znajdziesz w omówieniu MediaPlayer. Aby łatwiej korzystać z bardziej zaawansowanych funkcji, takich jak przesyłanie strumieniowe i pobieranie multimediów, użyj ExoPlayera. Stosuj sprawdzone metody dotyczące aplikacji audio, takie jak zarządzanie fokusem dźwięku.

Zapobieganie niepożądanemu odtwarzaniu multimediów przez wbudowane głośniki

Aby mieć pewność, że aplikacja nie będzie przypadkowo odtwarzać treści multimedialnych na wbudowanych głośnikach zegarka, deweloperzy aplikacji multimedialnych mogą postępować zgodnie z tymi wskazówkami. Wskazówki różnią się w zależności od odtwarzacza używanego przez aplikację.

ExoPlayer

Jeśli Twoja aplikacja korzysta z ExoPlayera:

  1. Podczas tworzenia instancji ExoPlayera wywołaj funkcję setSuppressPlaybackOnUnsuitableOutput(true):

      ExoPlayer exoplayer = ExoPlayer.Builder(context)
              .setAudioAttributes(...)
              .setSuppressPlaybackWhenUnsuitableOutput(true)
              // ...
              .build()
          
  2. Zareaguj na zdarzenie wstrzymania odtwarzania, rejestrując WearUnsuitableOutputPlaybackSuppressionResolverListener jako detektor instancji ExoPlayer:

  3.   exoPlayer.addListener(WearUnsuitableOutputPlaybackSuppressionResolverListener(context))
        

Pakiet materiałów dla mediów dotyczących zegarmistrzostwa

Horologist MediaToolkit zawiera już logikę, która zapobiega niezamierzonemu odtwarzaniu multimediów na wbudowanych głośnikach zegarka.

Inne odtwarzacze multimediów