웨어러블 기기에서 오디오 재생

이 가이드에서는 Wear OS의 앱이 친숙한 Android API를 사용하여 오디오를 재생하는 방법을 설명합니다.

오디오 기기 감지

Wear OS 앱은 먼저 웨어러블 기기에 적절한 오디오 출력이 있는지 감지해야 합니다. 개발자는 웨어러블 기기에 다음 오디오 출력 중 하나 이상을 사용할 수 있을 것으로 예상할 수 있습니다.

다음 예에서는 앱이 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)

최상의 사용자 환경을 제공하려면 앱에서 블루투스 헤드폰이나 스피커가 시계에 연결되어 있을 때만 미디어를 재생하도록 해야 합니다.

오디오 출력에 사용할 기본 기기 선택

앱의 사용 사례와 앱의 핵심 환경에 대한 오디오의 중요성에 따라 사용자가 앱의 오디오 출력에 어떻게 참여할 것인지 선택합니다.

블루투스 헤드셋

기기에 있는 경우 항상 사용할 수 있는 내장 스피커와 달리 블루투스 헤드셋은 앱이 실행되는 동안 페어링되거나 페어링 해제될 수 있습니다. 앱에서 계속 진행하는 데 헤드셋이 필요한 경우

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)
  

오디오 출력을 제공하려고 할 때 연결된 블루투스 헤드셋이 없음을 앱에서 감지하는 경우 오류 메시지를 표시하지 마세요. 대신 더 쉽게 연결할 수 있도록 사용자에게 블루투스 설정으로 직접 이동하라고 제안합니다. 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를 사용하는 경우:

  1. ExoPlayer 인스턴스를 빌드하는 동안 setSuppressPlaybackOnUnsuitableOutput(true)를 호출합니다.

      ExoPlayer exoplayer = ExoPlayer.Builder(context)
              .setAudioAttributes(...)
              .setSuppressPlaybackWhenUnsuitableOutput(true)
              // ...
              .build()
          
  2. WearUnsuitableOutputPlaybackSuppressionResolverListener를 ExoPlayer 인스턴스의 리스너로 등록하여 재생 억제 이벤트에 반응합니다.

  3.   exoPlayer.addListener(WearUnsuitableOutputPlaybackSuppressionResolverListener(context))
        

Horologist 미디어 툴킷

Horologist MediaToolkit에는 내장된 시계 스피커에서 의도치 않은 미디어 재생을 방지하는 로직이 이미 포함되어 있습니다.

기타 미디어 플레이어