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