เปิดเสียงบนอุปกรณ์ที่สวมใส่ได้

คู่มือนี้อธิบายวิธีที่แอปใน Wear OS ใช้ Android API ที่คุ้นเคยเพื่อเล่นเสียง

ตรวจหาอุปกรณ์เสียง

แอป Wear OS ต้องตรวจหาว่าอุปกรณ์ที่สวมใส่ได้มีเอาต์พุตเสียงที่เหมาะสมหรือไม่ก่อน นักพัฒนาแอปคาดหวังได้ว่าอุปกรณ์ที่สวมใส่ได้จะมีเอาต์พุตเสียงต่อไปนี้อย่างน้อย 1 รายการ

ในตัวอย่างต่อไปนี้ แอปใช้วิธีการ 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 ให้ทำดังนี้

  1. เรียกใช้ setSuppressPlaybackOnUnsuitableOutput(true) ขณะสร้างอินสแตนซ์ ExoPlayer

      ExoPlayer exoplayer = ExoPlayer.Builder(context)
              .setAudioAttributes(...)
              .setSuppressPlaybackWhenUnsuitableOutput(true)
              // ...
              .build()
          
  2. ตอบสนองต่อเหตุการณ์การระงับการเล่นโดยการลงทะเบียน WearUnsuitableOutputPlaybackSuppressionResolverListener เป็น Listener ของอินสแตนซ์ ExoPlayer ดังนี้

  3.   exoPlayer.addListener(WearUnsuitableOutputPlaybackSuppressionResolverListener(context))
        

ชุดเครื่องมือสำหรับสื่อของ Horologist

Horologist MediaToolkit มีตรรกะอยู่แล้วเพื่อป้องกันการเล่นสื่อโดยไม่ตั้งใจบนลำโพงของนาฬิกาที่ติดตั้งมา

มีเดียเพลเยอร์อื่นๆ