オーディオ グラスとディスプレイ グラスの実行時のデバイスの可用性を確認する

対象となる XR デバイス
このガイダンスは、次のようなタイプの XR デバイス向けのエクスペリエンスを構築する際に役立ちます。
オーディオ グラスと
ディスプレイ グラス

ユーザーが 1 日を過ごす中で、オーディオ グラスやディスプレイ グラスが ホスト デバイス(ユーザーのスマートフォンなど)との接続を失うことがあります。また、グラスを外すと一時的に使用できなくなることもあります。このようなデバイスの可用性の変化に対応するため、アプリでは XR Device Availability API を使用できます。この API は、デバイスの可用性シグナルを 標準の Android Lifecycle.State 値に統合します。この API を使用すると、オーディオ ルーティングやホットワードの有効化を管理しやすくなります。また、グラスが使用可能になったときにユーザー入力がいつ発生するかを把握できます。

ライフサイクルの状態を理解する

次の表に、デバイスの可用性シグナルが Lifecycle.State 値にどのようにマッピングされるかを示します。

ライフサイクルの状態

デバイスのステータス

説明

INITIALIZED

作成日時

ライフサイクル オブジェクトが作成されたが、まだ監視されていない。

CREATED

無効

サービスは接続されているが、ユーザーがデバイスを装着していない。

STARTED

有効

ユーザーがデバイスを装着している。

DESTROYED

未接続

デバイスが切断されているか、サービス接続が失われている。

デバイスの可用性を確認してモニタリングする

デバイスの可用性を確認してモニタリングするには、投影されたコンテキストとライフサイクルの状態を使用して、アプリが各ケースをどのように処理すべきかを判断します。

    // In your phone activity or service, check for projected device connection state before
    // attempting to create a projected device context and get the device lifecycle.
    ProjectedContext.isProjectedDeviceConnected(context, currentCoroutineContext())
        .flatMapLatest { isConnected ->
            if (isConnected) {
                try {
                    // Create the projected device context on connection
                    val projectedContext = ProjectedContext.createProjectedDeviceContext(context)
                    val xrDevice = XrDevice.getCurrentDevice(projectedContext)

                    // Get the device lifecycle
                    xrDevice.getLifecycle().currentStateFlow
                } catch (e: IllegalStateException) {
                    flowOf(Lifecycle.State.DESTROYED)
                }
            } else {
                flowOf(Lifecycle.State.DESTROYED)
            }
        }
        .collect { state ->
            when (state) {
                Lifecycle.State.STARTED -> { /* Device is available (worn) */ }
                Lifecycle.State.CREATED -> { /* Device is unavailable (not worn) */ }
                Lifecycle.State.DESTROYED -> { /* Device is disconnected from host phone */ }
                else -> { /* Handle other states */ }
            }
        }
}

コードに関する主なポイント

  • 接続を確認する: デバイスのライフサイクルにアクセスする前に、 ProjectedContext.isProjectedDeviceConnected を呼び出して、 投影されたデバイスがホスト デバイスに接続されていることを確認します。
  • ProjectedContext を取得する: 接続を確認した後でのみ ProjectedContext.createProjectedDeviceContext を呼び出し、このコンテキストを XrDevice インスタンスに渡します。
  • コンテキストの無効化を処理する: 投影されたデバイスが接続されるたびに、新しいdeviceIdが生成されます。状態が DESTROYED に達すると、現在の ProjectedContext は無効になります。すぐに使用を停止し、新しい接続を待ちます。
  • バッテリーとリソースを最適化する: ライフサイクルの状態に基づいてアプリの機能を適切に処理し、システム リソースを保持してバッテリー消費量を削減します。たとえば、状態が STARTED から CREATED に戻った場合は、カメラのデータ ストリームなど、グラス固有のリソースを解放する必要があります。CREATED 状態は、デバイスが装着されていないことを示します。そのため、不要なバッテリーの消耗を防ぎ、ユーザーのプライバシーを保護するには、これらのプロセスを停止することが不可欠です。