AI 眼镜体验基于现有的 Android Activity 框架 API 构建,包含其他概念,以支持 AI 眼镜的独特方面。与在设备上运行完整 APK 的 XR 头戴式显示器不同,AI 眼镜使用在手机现有应用中运行的专用 activity。此 activity 从主机设备投影到 AI 眼镜。
如需创建应用的 AI 眼镜体验,您可以为 AI 眼镜创建一个新的投影 Activity,从而扩展现有的手机应用。此 activity 用作 AI 眼镜上应用的主要启动入口点。这种方法可简化开发流程,因为您可以在手机和 AI 眼镜体验之间共享和重复使用业务逻辑。
在应用的清单中声明 activity
与其他类型的 activity 一样,您需要在应用的清单文件中声明您的 activity,以便系统能够看到并运行它。
<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,以告知系统此 activity 应使用投影上下文来访问所连接设备的硬件。
创建活动
接下来,您将创建一个小型 activity,以便在显示屏开启时在 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.
}
}
代码要点
AIGlassesActivity扩展了ComponentActivity,正如您在移动开发中所期望的那样。onCreate()中的setContent块定义了 activity 的可组合界面树的根。- 在 activity 的
onCreate()方法中初始化界面(请参阅预计的 activity 生命周期)。 - 使用 Jetpack Compose Glimmer 设置具有黑色背景的
TopBarScaffold界面基本布局。
实现可组合项
您创建的 activity 引用了一个需要实现的 DisplayUi 可组合函数。以下代码使用 Jetpack Compose Glimmer 定义了一个可组合项,该可组合项可在 AI 眼镜的显示屏上显示一些文本:
@Composable
fun DisplayUi() {
Box(
modifier = Modifier
.fillMaxSize(),
contentAlignment = Alignment.Center
) {
Text("Hello World!")
}
}
代码要点
- 正如您在之前的 activity 中所定义的那样,
DisplayUi函数包含 AI 眼镜显示屏开启时用户看到的可组合内容。 - Jetpack Compose Glimmer
Text组件会在眼镜的显示屏上显示“Hello World!”文本。
开始活动
现在,您已经创建了一个基本 activity,接下来可以将其启动到眼镜上。 如需访问眼镜的硬件,您的应用必须使用特定选项启动 activity,以告知系统使用投影上下文,如以下代码所示:
val options = ProjectedContext.createProjectedActivityOptions(context)
val intent = Intent(context, AIGlassesActivity::class.java)
context.startActivity(intent, options.toBundle())
ProjectedContext 中的 createProjectedActivityOptions() 方法会生成在投影上下文中启动 activity 所需的选项。context 参数可以是手机或眼镜设备的上下文。
检查 AI 眼镜是否已连接
如果您想在启动 activity 之前确定用户的 AI 眼镜是否已连接到其手机,请使用 ProjectedContext.isProjectedDeviceConnected() 方法。此方法会返回一个 Flow<Boolean>,您的应用可以观察该对象,以获取有关连接状态的实时更新。
后续步骤
现在,您已经为 AI 眼镜创建了第一个 activity,接下来可以探索其他扩展其功能的方法: