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

คีย์เวิร์ด: wear, media, collection_guideslandingwear

คู่มือนี้จะอธิบายวิธีที่แอปใน 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 ขึ้นไป ให้เสนอที่จะนําผู้ใช้ไปยังตัวสลับเอาต์พุตสื่อโดยตรง ในอุปกรณ์ที่ไม่รองรับตัวสลับเอาต์พุตสื่อ ให้เรียกใช้การดำเนินการของ 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 ให้ทำดังนี้

  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 มีตรรกะเพื่อป้องกันไม่ให้เล่นสื่อโดยไม่ตั้งใจบนลำโพงในตัวนาฬิกาอยู่แล้ว

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

  • ตรวจสอบว่าการเล่นเสียงของสื่อไม่เริ่มขึ้นเว้นแต่จะมีการเชื่อมต่ออุปกรณ์เอาต์พุตที่เหมาะสม เช่น ชุดหูฟังหรือลำโพงภายนอก กับนาฬิกา ดูรายการอุปกรณ์เอาต์พุตที่เหมาะสมสำหรับแอปสื่อได้จากรายการต่อไปนี้
  • หยุดเล่นชั่วคราวหาก AudioManager แจ้งให้แอปทราบว่าอุปกรณ์เอาต์พุตเสียงภายนอกตัดการเชื่อมต่อจากนาฬิกา
  • เมื่อผู้ใช้พยายามเริ่มเล่นสื่อแต่ยังไม่ได้เชื่อมต่ออุปกรณ์เสียงภายนอก ให้แจ้งให้ผู้ใช้เชื่อมต่ออุปกรณ์ดังกล่าวกับนาฬิกา