为 AI 眼镜创建首个 activity

适用的 XR 设备
本指南可帮助您为以下类型的 XR 设备打造优质体验。
AI 眼镜

AI 眼镜体验基于现有的 Android Activity 框架 API 构建,包含其他概念,以支持 AI 眼镜的独特方面。与在设备上运行完整 APK 的 XR 头戴设备不同,AI 眼镜使用在手机的现有应用中运行的专用 activity。此 activity 从主机设备投影到 AI 眼镜。

如需创建应用的 AI 眼镜体验,您可以为 AI 眼镜创建新的投影 Activity,从而扩展现有的手机应用。此 activity 用作 AI 眼镜上应用的主要启动入口点。这种方法可简化开发流程,因为您可以在手机和 AI 眼镜体验之间共享和重复使用业务逻辑。

版本兼容性

查看 Jetpack XR SDK 的 Android SDK 兼容性要求

依赖项

添加以下 AI 眼镜的库依赖项

Groovy

dependencies {
    implementation "androidx.xr.runtime:runtime:1.0.0-alpha10"
    implementation "androidx.xr.glimmer:glimmer:1.0.0-alpha06"
    implementation "androidx.xr.projected:projected:1.0.0-alpha04"
    implementation "androidx.xr.arcore:arcore:1.0.0-alpha10"
}

Kotlin

dependencies {
    implementation("androidx.xr.runtime:runtime:1.0.0-alpha10")
    implementation("androidx.xr.glimmer:glimmer:1.0.0-alpha06")
    implementation("androidx.xr.projected:projected:1.0.0-alpha04")
    implementation("androidx.xr.arcore:arcore:1.0.0-alpha10")
}

在应用的清单中声明 activity

与其他类型的 activity 一样,您需要在应用的清单文件中声明您的 activity,以便系统能够看到并运行它。

<application>
  <activity
      android:name="com.example.xr.projected.GlassesMainActivity"
      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,以告知系统此 activity 应使用投影上下文来访问所连接设备的硬件。

创建活动

接下来,您将创建一个小型 activity,以便在显示屏开启时在 AI 眼镜上显示内容。

@OptIn(ExperimentalProjectedApi::class)
class GlassesMainActivity : ComponentActivity() {

    private var displayController: ProjectedDisplayController? = null
    private var isVisualUiSupported by mutableStateOf(false)
    private var areVisualsOn by mutableStateOf(true)

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

        lifecycle.addObserver(object : DefaultLifecycleObserver {
            override fun onDestroy(owner: LifecycleOwner) {
                displayController?.close()
                displayController = null
            }
        })

        lifecycleScope.launch {
            // Check device capabilities
            val projectedDeviceController = ProjectedDeviceController.create(this@GlassesMainActivity)
            isVisualUiSupported = projectedDeviceController.capabilities.contains(CAPABILITY_VISUAL_UI)

            val controller = ProjectedDisplayController.create(this@GlassesMainActivity)
            displayController = controller
            val observer = GlassesLifecycleObserver(
                context = this@GlassesMainActivity,
                controller = controller,
                onVisualsChanged = { visualsOn -> areVisualsOn = visualsOn }
            )
            lifecycle.addObserver(observer)
        }

        setContent {
            GlimmerTheme {
                HomeScreen(
                    areVisualsOn = areVisualsOn,
                    isVisualUiSupported = isVisualUiSupported,
                    onClose = { finish() }
                )
            }
        }
    }
}

代码要点

实现可组合项

您创建的 activity 引用了一个需要实现的 HomeScreen 可组合函数。以下代码使用 Jetpack Compose Glimmer 定义了一个可组合项,该可组合项可在 AI 眼镜的显示屏上显示一些文本:

@Composable
fun HomeScreen(
    areVisualsOn: Boolean,
    isVisualUiSupported: Boolean,
    onClose: () -> Unit,
    modifier: Modifier = Modifier
) {
    Box(
        modifier = modifier
            .surface(focusable = false)
            .fillMaxSize(),
        contentAlignment = Alignment.Center
    ) {
        if (isVisualUiSupported) {
            Card(
                title = { Text("Android XR") },
                action = {
                    Button(onClick = onClose) {
                        Text("Close")
                    }
                }
            ) {
                if (areVisualsOn) {
                    Text("Hello, AI Glasses!")
                } else {
                    Text("Display is off. Audio guidance active.")
                }
            }
        } else {
            Text("Audio Guidance Mode Active")
        }
    }
}

代码要点

  • 正如您在之前的 activity 中所定义的那样,HomeScreen 函数包含 AI 眼镜显示屏开启时用户看到的可组合内容。
  • Jetpack Compose Glimmer Text 组件会在眼镜的显示屏上显示“Hello, AI Glasses!”文本。
  • Jetpack Compose Glimmer Button 通过 AI 眼镜 activity 中的 onClose 调用 finish() 来关闭 activity。

检查 AI 眼镜是否已连接

如需在启动 activity 之前确定用户的 AI 眼镜是否已连接到手机,请使用 ProjectedContext.isProjectedDeviceConnected 方法。此方法会返回一个 Flow<Boolean>,您的应用可以观察该对象,以获取有关连接状态的实时更新。

开始活动

现在,您已经创建了一个基本 activity,接下来可以将其启动到眼镜上。 如需访问眼镜的硬件,您的应用必须使用特定选项启动 activity,以告知系统使用投影上下文,如以下代码所示:

val options = ProjectedContext.createProjectedActivityOptions(context)
val intent = Intent(context, GlassesMainActivity::class.java)
context.startActivity(intent, options.toBundle())

ProjectedContext 中的 createProjectedActivityOptions 方法会生成在投影上下文中启动 activity 所需的选项。context 参数可以是手机或眼镜设备的上下文。

后续步骤

现在,您已经为 AI 眼镜创建了第一个 activity,接下来可以探索其他扩展其功能的方法: