ウェアラブルで音声を再生する

keywords: 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)

最適なユーザー エクスペリエンスを提供するため、アプリは Bluetooth ヘッドフォンまたはスピーカーがスマートウォッチに接続されている場合にのみ、メディアを再生できるようにする必要があります。

オーディオを出力する優先デバイスを選択する

アプリのユースケースと、アプリのコア エクスペリエンスに対するオーディオの重要性に応じて、ユーザーがアプリのオーディオ出力を操作する方法を選択します。

ユーザーがメディア出力デバイスを選択できるようにする

Wear OS 5 以降では、ユーザーがメディアを再生するデバイスを選択したり、現在再生中のメディア コンテンツに関する情報を表示したりできる UI がシステムに用意されています。

Wear OS 5 以降を搭載したデバイスでオーディオ再生を提供しようとしているときに、Bluetooth ヘッドセットが接続されていないことをアプリが検出した場合、メディア出力切り替えツールに直接移動することをユーザーに提案します。メディア出力切り替えスイッチをサポートしていないデバイスでは、ACTION_BLUETOOTH_SETTINGS インテント アクションを呼び出します。これにより、システム設定の Bluetooth ページが表示されます。

GitHub の Horologist ライブラリの一部である launchOutputSelection() メソッドは、ユーザーにメディア出力デバイスを選択させる方法を示しています。

Bluetooth ヘッドセット

搭載されていれば常に利用できる内蔵スピーカーとは異なり、Bluetooth ヘッドセットは、アプリの実行中にペア設定されたり、ペア設定を解除されたりすることがあります。アプリで次に進むためにヘッドセットが必要な場合は、registerAudioDeviceCallback を使用して、ユーザーが Bluetooth ヘッドセットを接続もしくは切断したことを検出するコールバックを登録します。

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)
  

アプリがオーディオ出力を提供しようとしているときに、Bluetooth ヘッドセットが接続されていないことをアプリが検出した場合、エラー メッセージは表示しないでください。代わりに、ユーザーが簡単に接続できるように Bluetooth 設定に直接移動することを提案します。そのためには、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 Media ツールキット

Horologist MediaToolkit には、内蔵スマートウォッチ スピーカーでの意図しないメディア再生を防ぐロジックがすでに含まれています。

その他のメディア プレーヤー