คีย์เวิร์ด: wear, media, collection_guideslandingwear
คู่มือนี้จะอธิบายวิธีที่แอปใน Wear OS ใช้ Android API ที่ผู้ใช้คุ้นเคยเพื่อเล่นเสียง
ตรวจหาอุปกรณ์เสียง
ก่อนอื่น แอป Wear OS ต้องตรวจหาว่าอุปกรณ์ที่สวมใส่ได้มีพอร์ตเอาต์พุตเสียงที่เหมาะสมหรือไม่ นักพัฒนาแอปสามารถคาดหวังได้ว่าอุปกรณ์ที่สวมใส่ได้จะมีเอาต์พุตเสียงอย่างน้อย 1 รายการต่อไปนี้
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)
แอปของคุณควรเล่นสื่อเฉพาะเมื่อเชื่อมต่อหูฟังหรือลำโพงบลูทูธกับนาฬิกาเท่านั้น เพื่อให้ผู้ใช้ได้รับประสบการณ์การใช้งานที่ดีที่สุด
เลือกอุปกรณ์ที่ต้องการสำหรับเอาต์พุตเสียง
เลือกวิธีที่ต้องการให้ผู้ใช้มีส่วนร่วมกับเอาต์พุตเสียงของแอป โดยขึ้นอยู่กับ Use Case ของแอปและความสำคัญของเสียงต่อประสบการณ์หลักของแอป
อนุญาตให้ผู้ใช้เลือกอุปกรณ์เอาต์พุตสื่อ
ตั้งแต่ Wear OS 5 เป็นต้นไป ระบบจะมี UI ที่ช่วยให้ผู้ใช้เลือกอุปกรณ์ที่จะเล่นสื่อและแสดงข้อมูลเกี่ยวกับเนื้อหาสื่อที่เล่นอยู่ในปัจจุบันได้
หากแอปตรวจพบว่าไม่มีการเชื่อมต่อชุดหูฟังบลูทูธเมื่อคุณต้องการเล่นเสียงในอุปกรณ์ที่ใช้ Wear OS 5 ขึ้นไป ให้เสนอที่จะนําผู้ใช้ไปยังตัวสลับเอาต์พุตสื่อโดยตรง ในอุปกรณ์ที่ไม่รองรับตัวสลับเอาต์พุตสื่อ ให้เรียกใช้การดำเนินการของ Intent ACTION_BLUETOOTH_SETTINGS
ซึ่งจะนำผู้ใช้ไปยังหน้าบลูทูธในการตั้งค่าระบบ
เมธอด launchOutputSelection()
ซึ่งเป็นส่วนหนึ่งของไลบรารี Horologist ใน GitHub แสดงวิธีอนุญาตให้ผู้ใช้เลือกอุปกรณ์เอาต์พุตสื่อ
ชุดหูฟังบลูทูธ
ซึ่งแตกต่างจากลำโพงในตัวที่พร้อมใช้งานเสมอหากมีอยู่ในอุปกรณ์ แต่ชุดหูฟังบลูทูธสามารถจับคู่หรือยกเลิกการเชื่อมต่อขณะที่แอปทำงานอยู่ หากแอปต้องใช้ชุดหูฟังต่อ ให้ลงทะเบียนการเรียกกลับเพื่อตรวจจับเมื่อผู้ใช้เชื่อมต่อและยกเลิกการเชื่อมต่อชุดหูฟังบลูทูธโดยใช้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)
หากแอปตรวจพบว่าไม่มีชุดหูฟังบลูทูธเชื่อมต่ออยู่เมื่อคุณต้องการส่งออกเสียง อย่าแสดงข้อความแสดงข้อผิดพลาด แต่ให้เสนอที่จะพาผู้ใช้ไปยังการตั้งค่าบลูทูธโดยตรงเพื่อให้เชื่อมต่อได้ง่ายขึ้น ซึ่งทำได้โดยส่ง Intent พร้อมข้อมูลต่อไปนี้
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 ส่วนใหญ่มีลำโพง หากแอปของคุณมี Use Case ที่ไม่ใช่สื่อซึ่งรวมเสียง ให้ลองใช้ลำโพงเพื่อเพิ่มการมีส่วนร่วมกับผู้ใช้อีกระดับ เช่น อุปกรณ์ Wear OS ที่มีลำโพงอาจทริกเกอร์การปลุกของนาฬิกาหรือตัวจับเวลาพร้อมการแจ้งเตือนด้วยเสียง และแอปฟิตเนสอาจใช้ลำโพงเพื่อแสดงวิธีการออกกำลังกาย
หมายเหตุ: ลำโพงไม่ได้ให้ประสบการณ์ที่ดีที่สุดในการฟังเนื้อหาสื่อ เนื่องจากไม่ได้ออกแบบมาเพื่อวัตถุประสงค์นี้
ดูรายละเอียดได้ใน WearSpeakerSample
เล่นเสียง
เมื่อตรวจหาและเลือกเอาต์พุตเสียงที่เหมาะสมแล้ว กระบวนการเล่นเสียงใน Wear OS จะเหมือนกับในอุปกรณ์เคลื่อนที่หรืออุปกรณ์อื่นๆ ดูข้อมูลเพิ่มเติมได้ที่ภาพรวม MediaPlayer หากต้องการเข้าถึงฟีเจอร์ขั้นสูงอื่นๆ เช่น สตรีมมิงและการดาวน์โหลดสื่อได้ง่ายขึ้น ให้ใช้ ExoPlayer อย่าลืมทำตามแนวทางปฏิบัติแนะนำสำหรับแอปเสียง เช่น การจัดการโฟกัสเสียง
ป้องกันไม่ให้เล่นสื่อผ่านลำโพงโดยไม่ตั้งใจ
แอปสื่อสามารถปฏิบัติตามคำแนะนำต่อไปนี้เพื่อให้แน่ใจว่าแอปจะไม่เล่นเนื้อหาสื่อในลำโพงในตัวของนาฬิกาโดยไม่ตั้งใจ คำแนะนำจะแตกต่างกันไปตามโปรแกรมเล่นที่แอปใช้
ExoPlayer
หากแอปใช้ ExoPlayer ให้ทำดังนี้
เรียกใช้ setSuppressPlaybackOnUnsuitableOutput(true)ขณะสร้างอินสแตนซ์ ExoPlayer
ExoPlayer exoplayer = ExoPlayer.Builder(context) .setAudioAttributes(...) .setSuppressPlaybackWhenUnsuitableOutput(true) // ... .build()
-
ตอบสนองต่อเหตุการณ์การระงับการเล่นโดยลงทะเบียน WearUnsuitableOutputPlaybackSuppressionResolverListener เป็น Listener ของอินสแตนซ์ ExoPlayer ดังนี้
exoPlayer.addListener(WearUnsuitableOutputPlaybackSuppressionResolverListener(context))
ชุดเครื่องมือสื่อของ Horologist
Horologist MediaToolkit มีตรรกะเพื่อป้องกันไม่ให้เล่นสื่อโดยไม่ตั้งใจบนลำโพงในตัวนาฬิกาอยู่แล้ว
มีเดียเพลเยอร์อื่นๆ
- ตรวจสอบว่าการเล่นเสียงของสื่อไม่เริ่มขึ้นเว้นแต่จะมีการเชื่อมต่ออุปกรณ์เอาต์พุตที่เหมาะสม เช่น ชุดหูฟังหรือลำโพงภายนอก กับนาฬิกา ดูรายการอุปกรณ์เอาต์พุตที่เหมาะสมสำหรับแอปสื่อได้จากรายการต่อไปนี้
- หยุดเล่นชั่วคราวหาก AudioManager แจ้งให้แอปทราบว่าอุปกรณ์เอาต์พุตเสียงภายนอกตัดการเชื่อมต่อจากนาฬิกา
- เมื่อผู้ใช้พยายามเริ่มเล่นสื่อแต่ยังไม่ได้เชื่อมต่ออุปกรณ์เสียงภายนอก ให้แจ้งให้ผู้ใช้เชื่อมต่ออุปกรณ์ดังกล่าวกับนาฬิกา