AI グラス用の最初のアクティビティを作成する

対象の XR デバイス
このガイダンスは、このようなタイプの XR デバイス向けのエクスペリエンスを構築する際に役立ちます。
AI メガネ

AI グラスのエクスペリエンスは、既存の Android Activity フレームワーク API をベースに構築されており、AI グラスの独自性をサポートする追加のコンセプトが含まれています。デバイス上で完全な APK を実行する XR ヘッドセットとは異なり、AI グラスはスマートフォンの既存のアプリ内で実行される専用のアクティビティを使用します。このアクティビティは、ホストデバイスから AI グラスに投影されます。

アプリの AI グラス エクスペリエンスを作成するには、AI グラス用の新しい投影 Activity を作成して、既存のスマートフォン アプリを拡張します。このアクティビティは、AI グラスでのアプリのメインの起動エントリ ポイントとして機能します。このアプローチでは、スマートフォンと AI グラスのエクスペリエンス間でビジネス ロジックを共有して再利用できるため、開発が簡素化されます。

アプリのマニフェストでアクティビティを宣言する

他のタイプのアクティビティと同様に、システムがアクティビティを認識して実行できるように、アプリのマニフェスト ファイルでアクティビティを宣言する必要があります。

<application>
    <activity
        android:name=".AIGlassesActivity"
        android:exported="true"
        android:requiredDisplayCategory="xr_projected"
        android:label="Example AI Glasses activity">
      <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
      </intent-filter>
    </activity>
</application>

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

  • android:requiredDisplayCategory 属性に xr_projected を指定して、このアクティビティが投影されたコンテキストを使用して接続されたデバイスからハードウェアにアクセスする必要があることをシステムに伝えます。

アクティビティを作成する

次に、ディスプレイがオンになるたびに AI グラスに何かを表示できる小さなアクティビティを作成します。

/**
 *   When this activity launches, it stays in the started state.
 */
class AIGlassesActivity : ComponentActivity() {

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    val projectedWindowManager = ProjectedWindowManager.create(this)

    setContent {

      GlassesComposeContent {
        GlimmerTheme {
          TopBarScaffold(modifier = Modifier.background(color = Color.Black)) {

            ProjectedDisplayController.create(activity)
            .addPresentationModeChangedListener {
            presentationModeFlags ->

            // Check whether visuals are on or off
            val areVisualsOff = !presentationModeFlags.hasPresentationMode(VISUALS_ON)
            }

            // Conditional UI based on presentation mode.
            if (areVisualsOff) {
              // Implementation for the when the display is off.
            } else {
              DisplayUi()
            }
          }
        }
      }
    }
  }

  override fun onStart() {
    // Do things to make the user aware that this activity is active (for
    // example, play audio frequently), when the display is off.
  }

  override fun onStop() {
    // Stop all the data source access.
  }

}

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

コンポーザブルを実装する

作成したアクティビティは、実装する必要がある DisplayUi コンポーザブル関数を参照します。次のコードでは、Jetpack Compose Glimmer を使用して、AI グラスのディスプレイにテキストを表示できるコンポーザブルを定義しています。

@Composable
fun DisplayUi() {
    Box(
        modifier = Modifier
            .fillMaxSize(),
        contentAlignment = Alignment.Center
    ) {
        Text("Hello World!")
    }
}

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

  • アクティビティで定義したように、DisplayUi 関数には、AI グラスのディスプレイがオンのときにユーザーに表示されるコンポーザブル コンテンツが含まれています。
  • Jetpack Compose Glimmer の Text コンポーネントは、メガネのディスプレイに「Hello World!」というテキストを表示します。

アクティビティを開始する

基本的なアクティビティを作成したので、グラスで起動できます。メガネのハードウェアにアクセスするには、次のコードに示すように、アプリは 投影コンテキストを使用するようにシステムに指示する特定のオプションを指定してアクティビティを開始する必要があります。

val options = ProjectedContext.createProjectedActivityOptions(context)

val intent = Intent(context, AIGlassesActivity::class.java)

context.startActivity(intent, options.toBundle())

ProjectedContextcreateProjectedActivityOptions() メソッドは、投影されたコンテキストでアクティビティを開始するために必要なオプションを生成します。context パラメータは、スマートフォンまたはメガネ型デバイスのコンテキストです。

AI グラスが接続されているかどうかを確認する

アクティビティを起動する前に、ユーザーの AI グラスがスマートフォンに接続されているかどうかを確認するには、ProjectedContext.isProjectedDeviceConnected() メソッドを使用します。このメソッドは、アプリが接続ステータスのリアルタイム更新を取得するために監視できる Flow<Boolean> を返します。

次のステップ

AI グラス用の最初のアクティビティを作成したので、その機能を拡張する他の方法を見てみましょう。