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-alpha12"
implementation "androidx.xr.glimmer:glimmer:1.0.0-alpha11"
implementation "androidx.xr.glimmer:glimmer-google-fonts:1.0.0-alpha11"
implementation "androidx.xr.projected:projected:1.0.0-alpha06"
implementation "androidx.xr.arcore:arcore:1.0.0-alpha12"
}
Kotlin
dependencies {
implementation("androidx.xr.runtime:runtime:1.0.0-alpha12")
implementation("androidx.xr.glimmer:glimmer:1.0.0-alpha11")
implementation("androidx.xr.glimmer:glimmer-google-fonts:1.0.0-alpha11")
implementation("androidx.xr.projected:projected:1.0.0-alpha06")
implementation("androidx.xr.arcore:arcore:1.0.0-alpha12")
}
在应用的清单中声明 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
接下来,您将创建一个小型 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) private var isPermissionDenied by mutableStateOf(false) // Register the permissions launcher using the ProjectedPermissionsResultContract. private val requestPermissionLauncher: ActivityResultLauncher<List<ProjectedPermissionsRequestParams>> = registerForActivityResult(ProjectedPermissionsResultContract()) { results -> if (results[Manifest.permission.CAMERA] == true) { isPermissionDenied = false initializeGlassesFeatures() } else { // Handle permission denial. isPermissionDenied = true } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) lifecycle.addObserver(object : DefaultLifecycleObserver { override fun onDestroy(owner: LifecycleOwner) { displayController?.close() displayController = null } }) if (hasCameraPermission()) { initializeGlassesFeatures() } else { requestHardwarePermissions() } setContent { GlimmerTheme { HomeScreen( areVisualsOn = areVisualsOn, isVisualUiSupported = isVisualUiSupported, isPermissionDenied = isPermissionDenied, onRetryPermission = { requestHardwarePermissions() }, onClose = { finish() } ) } } } private fun initializeGlassesFeatures() { 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) } } private fun hasCameraPermission(): Boolean { return ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED } private fun requestHardwarePermissions() { val params = ProjectedPermissionsRequestParams( permissions = listOf(Manifest.permission.CAMERA), rationale = "Camera access is required to overlay digital content on your physical environment." ) requestPermissionLauncher.launch(listOf(params)) } }
代码要点
- 选择使用 选择启用型 API,这些 API 来自 Jetpack Projected 库。
GlassesMainActivity扩展了ComponentActivity,正如您在移动开发中所 预期的那样。- 由于并非所有 AI 眼镜都有显示屏,因此使用
ProjectedDeviceController检查设备是否有 显示屏。 onCreate函数中的setContent块定义了 activity 的可组合界面树的根。您将使用 Jetpack Compose Glimmer 实现HomeScreen可组合项。- 在 activity 的
onCreate方法期间初始化界面(请参阅 投影 activity 生命周期)。 - 为了准备访问眼镜硬件的相机相关功能,请通过注册权限启动器、定义
hasCameraPermission和requestHardwarePermissions函数,并在调用initializeGlassesFeatures之前检查是否已授予权限来请求硬件权限。
实现可组合项
您创建的 activity 引用了需要实现的 HomeScreen 可组合函数。以下代码使用 Jetpack Compose Glimmer 来
定义一个可组合项,该可组合项可以在 AI 眼镜的显示屏上显示一些文本:
@Composable fun HomeScreen( areVisualsOn: Boolean, isVisualUiSupported: Boolean, isPermissionDenied: Boolean, onRetryPermission: () -> Unit, onClose: () -> Unit, modifier: Modifier = Modifier ) { Box( modifier = modifier .surface(focusable = false) .fillMaxSize(), contentAlignment = Alignment.Center ) { if (isPermissionDenied) { Card( title = { Text("Permission Required") }, action = { Button(onClick = onClose) { Text("Exit") } } ) { Text("Camera access is needed to use AI glasses features.") Button(onClick = onRetryPermission) { Text("Retry") } } } else 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 眼镜是否已连接
如需确定用户的 AI 眼镜是否已连接到手机,请在
启动 activity 之前使用
ProjectedContext.isProjectedDeviceConnected 方法。此方法
会返回一个 Flow<Boolean>,您的应用可以观察该方法以获取有关
连接状态的实时更新。
启动 activity
现在,您已创建了一个基本的 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,接下来可以探索其他扩展其功能的方法: