คู่มือนี้อธิบายวิธีที่แอปใน Wear OS ใช้ Android API ที่คุ้นเคยเพื่อเล่นเสียง
ตรวจหาอุปกรณ์เสียง
แอป Wear OS ต้องตรวจหาว่าอุปกรณ์ที่สวมใส่ได้มีเอาต์พุตเสียงที่เหมาะสมหรือไม่ก่อน นักพัฒนาแอปคาดหวังได้ว่าอุปกรณ์ที่สวมใส่ได้จะมีเอาต์พุตเสียงต่อไปนี้อย่างน้อย 1 รายการ
AudioDeviceInfo.TYPE_BUILTIN_SPEAKER
: ในอุปกรณ์ที่มีลำโพงในตัวAudioDeviceInfo.TYPE_BLUETOOTH_A2DP
: เมื่อจับคู่และเชื่อมต่อชุดหูฟังบลูทูธAudioDeviceInfo.TYPE_BLE_BROADCAST
: เมื่อจับคู่และเชื่อมต่ออุปกรณ์กลุ่มการออกอากาศบลูทูธพลังงานต่ำ (BLE)AudioDeviceInfo.TYPE_BLE_HEADSET
: เมื่อจับคู่และเชื่อมต่อชุดหูฟัง BLEAudioDeviceInfo.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 ขึ้นไป ให้เสนอที่จะนำ
ผู้ใช้ไปยังตัวสลับเอาต์พุตสื่อโดยตรง ในอุปกรณ์ที่ไม่รองรับตัวสลับเอาต์พุตสื่อ ให้เรียกใช้เจตนา 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 แจ้งเตือนแอปว่าอุปกรณ์เอาต์พุตเสียงภายนอกถูกตัดการเชื่อมต่อจากนาฬิกา
- เมื่อผู้ใช้พยายามเริ่มเล่นสื่อแต่ยังไม่ได้เชื่อมต่ออุปกรณ์เสียงภายนอก ให้แจ้งให้ผู้ใช้เชื่อมต่ออุปกรณ์ดังกล่าวกับนาฬิกา