在穿戴式裝置上播放音訊

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

audioOutputAvailable(AudioDeviceInfo.TYPE_BUILTIN_SPEAKER) // True if the device has a speaker
audioOutputAvailable(AudioDeviceInfo.TYPE_BLUETOOTH_A2DP) // True if a Bluetooth headset is connected

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

選擇偏好的音訊輸出裝置

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

藍牙耳機

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

請註冊回呼,使用 registerAudioDeviceCallback 偵測使用者的藍牙耳機連線狀態:

audioManager.registerAudioDeviceCallback(object : AudioDeviceCallback() {
    override fun onAudioDevicesAdded(addedDevices: Array<out AudioDeviceInfo>?) {
        super.onAudioDevicesAdded(addedDevices)
        if (audioOutputAvailable(AudioDeviceInfo.TYPE_BLUETOOTH_A2DP)) {
            // A Bluetooth headset has just been connected
        }
    }
    override fun onAudioDevicesRemoved(removedDevices: Array<out AudioDeviceInfo>?) {
        super.onAudioDevicesRemoved(removedDevices)
        if (!(audioOutputAvailable(AudioDeviceInfo.TYPE_BLUETOOTH_A2DP))) {
            // A Bluetooth headset is no longer connected
        }
    }
}, 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 已包含相關邏輯,可防止透過手錶內建喇叭意外播放媒體。

其他媒體播放器