在穿戴式裝置上播放音訊

關鍵字:wear、媒體、collection_guideslandingwear

本指南將說明 Wear OS 應用程式如何使用慣用的 Android API 播放音訊。

偵測音訊裝置

Wear OS 應用程式必須先偵測穿戴式裝置是否有合適的音訊輸出裝置。 開發人員可以預期穿戴式裝置擁有以下任一種可用音訊輸出裝置:

在以下範例中,應用程式會使用 getDevices() 方法搭配 FEATURE_AUDIO_OUTPUT 的值,列舉所有音訊輸出裝置。

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)

為提供最佳使用者體驗,應用程式務必只在藍牙耳機或喇叭與手錶連線時播放媒體。

選擇慣用的音訊輸出裝置

根據應用程式的用途,以及音訊對應用程式核心體驗的重要性,選擇您希望使用者與應用程式音訊輸出內容的互動方式。

讓使用者選擇媒體輸出裝置

自 Wear OS 5 起,系統會提供 UI,讓使用者選擇播放媒體的裝置,並顯示目前播放的媒體內容資訊。

如果應用程式在需要在搭載 Wear OS 5 以上版本的裝置上提供音訊播放功能時,偵測到沒有已連線的藍牙耳機,請提供將使用者直接帶往媒體輸出切換器的選項。在裝置不支援媒體輸出切換器的情況下,請叫用 ACTION_BLUETOOTH_SETTINGS 意圖動作,將使用者帶往系統設定中的藍牙頁面。

launchOutputSelection() 方法是 GitHub 上 Horologist 程式庫的一部分,可用於示範如何讓使用者選擇媒體輸出裝置。

藍牙耳機

與裝置上隨時可用的內建喇叭不同,藍牙耳機在應用程式執行期間可能會是配對或取消配對狀態。如果應用程式需要耳機才能繼續操作,請註冊回呼,使用 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)
  

如果應用程式在需要輸出音訊時偵測到沒有已連線的藍牙耳機,建議您不要顯示錯誤訊息,而是直接將使用者帶往藍牙設定,方便使用者連接耳機。傳送具有 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)
  

喇叭

多數 Wear OS 裝置都有配備喇叭。如果應用程式提供整合音效的非媒體用途,建議使用喇叭提供其他面向的使用者互動體驗。舉例來說,配備喇叭的 Wear OS 裝置可能會觸發時鐘或計時器鬧鐘,並在完成時發出語音通知,而健身應用程式則可利用喇叭提供運動相關指示。

注意:喇叭並非專為聆聽媒體內容的用途設計,因此無法提供最佳體驗。

詳情請參閱 WearSpeakerSample

播放音訊

偵測到並選擇合適的音訊輸出裝置後,Wear OS 播放音訊的程序和行動裝置及其他裝置相同。詳情請參閱「MediaPlayer 總覽」一文。如要以更簡單的方式存取其他進階功能,例如串流及下載媒體,請使用 ExoPlayer。請務必採用音訊應用程式的最佳做法,例如管理音訊焦點

防止意外透過喇叭播放媒體

媒體應用程式可以按照下列指引,確保應用程式不會意外透過手錶內建喇叭播放媒體內容。指引內容會因應用程式使用的播放器而有所不同。

ExoPlayer

如果應用程式使用 ExoPlayer:

  1. 建構 ExoPlayer 例項時,呼叫 setSuppressPlaybackOnUnsuitableOutput(true)

      ExoPlayer exoplayer = ExoPlayer.Builder(context)
              .setAudioAttributes(...)
              .setSuppressPlaybackWhenUnsuitableOutput(true)
              // ...
              .build()
          
  2. 註冊 WearUnsuitableOutputPlaybackSuppressionResolverListener 做為 ExoPlayer 例項的事件監聽器,因應播放抑制事件:

  3.   exoPlayer.addListener(WearUnsuitableOutputPlaybackSuppressionResolverListener(context))
        

Horologist Media Toolkit

Horologist Media Toolkit 已包含相關邏輯,可防止透過手錶內建喇叭意外播放媒體。

其他媒體播放器