在穿戴式裝置上播放音訊

本指南將說明 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)

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

選擇偏好的音訊輸出裝置

請根據應用程式的用途,以及音訊對應用程式核心體驗的重要性,選擇使用者如何與應用程式音訊輸出裝置互動。

藍牙耳機

與裝置上隨時可用的內建喇叭不同,藍牙耳機在應用程式執行期間可能會是配對或取消配對狀態。如果應用程式需要耳機才能繼續操作,

註冊回呼,偵測使用者何時使用 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 執行個體時,呼叫 setSuppressPlaybackOnUnblableOutput(true)

      ExoPlayer exoplayer = ExoPlayer.Builder(context)
              .setAudioAttributes(...)
              .setSuppressPlaybackWhenUnsuitableOutput(true)
              // ...
              .build()
          
  2. WearUneryableOutputPlaybackSuppressionResolverListener 註冊為 ExoPlayer 執行個體的事件監聽器,以回應播放抑制事件:

  3.   exoPlayer.addListener(WearUnsuitableOutputPlaybackSuppressionResolverListener(context))
        

Horologist 媒體工具包

Horologist MediaToolkit 已包含相關邏輯,避免在內建手錶喇叭上播放非預期媒體播放。

其他媒體播放器