このガイドでは、Wear OS のアプリで、使い慣れた Android API を使用してオーディオを再生する方法について説明します。
オーディオ機器を検出する
Wear OS アプリは、まずウェアラブル デバイスに適切なオーディオ出力があるかどうかを検出する必要があります。ウェアラブルでは、以下のオーディオ出力の 1 つ以上を利用できることが想定されます。
AudioDeviceInfo.TYPE_BUILTIN_SPEAKER
: スピーカーを内蔵しているデバイスでAudioDeviceInfo.TYPE_BLUETOOTH_A2DP
: Bluetooth ヘッドセットがペア設定され、接続されている場合AudioDeviceInfo.TYPE_BLE_BROADCAST
: Bluetooth Low Energy(BLE)ブロードキャスト グループ デバイスがペア設定され、接続されている場合AudioDeviceInfo.TYPE_BLE_HEADSET
: BLE ヘッドセットがペア設定され、接続されている場合AudioDeviceInfo.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)
最適なユーザー エクスペリエンスを提供するため、アプリは Bluetooth ヘッドフォンまたはスピーカーがスマートウォッチに接続されている場合にのみ、メディアを再生できるようにする必要があります。
オーディオを出力する優先デバイスを選択する
アプリのユースケースと、アプリのコア エクスペリエンスに対するオーディオの重要性に応じて、ユーザーがアプリのオーディオ出力を操作する方法を選択します。
ユーザーがメディア出力デバイスを選択できるようにする
Wear OS 5 以降では、ユーザーが選択する UI を デバイスはメディアを再生し、現在再生中のメディアに関する情報を表示します。 説明します。
Bluetooth ヘッドセットが接続されていないことをアプリが検出した場合、
Wear OS 5 以降を搭載するデバイスで音声を再生できるようにする場合は、
直接メディア出力の切り替えができます。対応していないデバイスについては、
メディア出力の切り替え、ACTION_BLUETOOTH_SETTINGS
インテントの呼び出し
アクション。ユーザーは、システム設定の [Bluetooth] ページに移動します。
launchOutputSelection()
メソッド(Horologist ライブラリの一部)
は、ユーザーがメディア出力デバイスを選択できるようにする方法を示しています。
Bluetooth ヘッドセット
搭載されていれば常に利用できる内蔵スピーカーとは異なり、Bluetooth ヘッドセットは、アプリの実行中にペア設定されたり、ペア設定を解除されたりすることがあります。続行するためにヘッドセットが必要な場合は、
イベントの発生を検出するコールバックを
ユーザーが Bluetooth ヘッドセットを接続または切断したとき
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)
アプリがオーディオ出力を提供しようとしているときに、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 を使用している場合:
ExoPlayer インスタンスの作成中に setSuppressPlaybackOnUnsuitableOutput(true) を呼び出します。
ExoPlayer exoplayer = ExoPlayer.Builder(context) .setAudioAttributes(...) .setSuppressPlaybackWhenUnsuitableOutput(true) // ... .build()
-
再生抑制イベントに対応するには、WearUnsuitableOutputPlaybackSuppressionResolverListener を ExoPlayer インスタンスのリスナーとして登録します。
exoPlayer.addListener(WearUnsuitableOutputPlaybackSuppressionResolverListener(context))
Horologist Media ツールキット
Horologist MediaToolkit には、内蔵スマートウォッチ スピーカーでの意図しないメディア再生を防ぐロジックがすでに含まれています。
その他のメディア プレーヤー
- 適切な出力デバイス(ヘッドセットや外部スピーカー セットなど)がスマートウォッチに接続されていない限り、メディアのオーディオの再生が開始されないことを確認します。メディアアプリに適した出力デバイスについては、下記のリストをご覧ください。
- 外部のオーディオ出力デバイスがスマートウォッチから切断されたことを AudioManager がアプリに通知した場合は、再生を一時停止します。
- メディアの再生を開始しようとしたときに、外部のオーディオ機器が接続されていない場合は、そのデバイスをスマートウォッチに接続するようユーザーに求めます。