本指南將說明 Wear OS 應用程式如何使用慣用的 Android API 播放音訊。
偵測音訊裝置
Wear OS 應用程式必須先偵測穿戴式裝置是否有合適的音訊輸出裝置。 開發人員可以預期穿戴式裝置擁有至少一種可用的音訊輸出裝置:
AudioDeviceInfo.TYPE_BUILTIN_SPEAKER
:表示裝置有內建喇叭AudioDeviceInfo.TYPE_BLUETOOTH_A2DP
:表示已與藍牙耳機配對及連線AudioDeviceInfo.TYPE_BLE_BROADCAST
:當藍牙低功耗 (BLE) 廣播群組裝置配對及連線時AudioDeviceInfo.TYPE_BLE_HEADSET
:表示已與 BLE 耳機配對及連線AudioDeviceInfo.TYPE_BLE_SPEAKER
:表示 BLE 揚聲器配對及連線時
在以下範例中,應用程式同時使用 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:
建構 ExoPlayer 執行個體時,呼叫 setSuppressPlaybackOnUnblableOutput(true):
ExoPlayer exoplayer = ExoPlayer.Builder(context) .setAudioAttributes(...) .setSuppressPlaybackWhenUnsuitableOutput(true) // ... .build()
-
將 WearUneryableOutputPlaybackSuppressionResolverListener 註冊為 ExoPlayer 執行個體的事件監聽器,以回應播放抑制事件:
exoPlayer.addListener(WearUnsuitableOutputPlaybackSuppressionResolverListener(context))
Horologist 媒體工具包
Horologist MediaToolkit 已包含相關邏輯,避免在內建手錶喇叭上播放非預期媒體播放。
其他媒體播放器
- 請確保裝置已連接至手錶的合適輸出裝置 (例如耳機或一組外接喇叭),否則無法啟動媒體音訊播放作業。 請參閱下列清單,瞭解媒體應用程式的適用輸出裝置:
- 如果 AudioManager 通知應用程式外部音訊輸出裝置與手錶中斷連線,就會暫停播放。
- 使用者嘗試啟動媒體播放,但未連線至外部音訊裝置時,提示使用者連接此類裝置。