在今年的 Google I/O 大会上,我们宣布了一项针对空间体验的更新:Geospatial API 现已上架 ARCore for Jetpack XR 中推出预览版。Android XR 引入了 Google 的视觉定位系统 (VPS),可在支持的区域内,以亚米级精度和精准方向将数字内容锚定到物理世界。*为了探索 Geospatial API 的潜力,我们的团队构建了一个演示项目:XR Geospatial Tour。
想象一下,您来到一座陌生的城市,戴上一副有线 XR 眼镜(例如即将推出的 XREAL Project Aura),瞬间就有一位知识渊博的本地向导带您四处游览。你无需盯着 2D 地图,3D 模型会为你温和指路,智能语音会为你介绍眼前的历史地标。我们结合使用了 Geospatial API、使用 Firebase AI Logic 的 Gemini API、Google 地图建立依据和 Jetpack XR SDK,打造出免触摸的沉浸式徒步游览体验。
免责声明:视频和 Tour Guide 应用仅用于演示目的。部分操作步骤经过精简。所描绘的任何硬件可能尚在开发中,最终商品详情可能有所不同。
下面我们来详细了解一下实现细节,并展示我们如何将这些 API 结合在一起,打造出世界级的空间体验。
1. 使用 ARCore Geospatial API (VPS) 精准定位用户
将 GPS 的强大功能与 VPS 的精准定位相结合,提升 XR 上的导航体验。VPS 提供的准确性和精确方向可让 3D 航点与现实世界保持一致。
因此,Android XR 上的 Geospatial API 可以帮助您打造自定义体验。通过使用先进的计算机视觉技术,VPS 会尝试提供比 GPS 更准确的 GeospatialPose(包括纬度、经度和航向)。
以下是我们如何通过将设备方向映射到地理空间坐标来检索用户的地理空间姿态:
// Retrieve the current geospatial pose from the ARCore session val result = geospatial.createGeospatialPoseFromPose(arDevice.state.value.devicePose) if (result is CreateGeospatialPoseFromPoseSuccess) { val pose = result.pose Log.d("VPS", "Accurate Location: ${pose.latitude}, ${pose.longitude}") }
由于整个体验都依赖于这种准确性,因此我们会监控horizontalAccuracy和orientationYawAccuracy,直到它们达到我们的阈值。如果用户在室内或无法识别的区域,我们会提示他们“走到室外公共空间并环顾四周”。
2. 使用 Gemini API 和 Google 地图接地功能制定行程
获取位置信息后,我们使用通过 Firebase AI Logic 调用的 Gemini API,提示 Gemini 模型充当本地导游。我们将用户的坐标传递给模型,并要求其输出包含附近徒步游览路线的结构化 JSON 回答:
val configForTools = ToolConfig( functionCallingConfig = null, retrievalConfig = retrievalConfig { latLng = FirebaseLatLng(pose.latitude, pose.longitude) languageCode = "en" } ) val responseJsonSchema = Schema.obj( mapOf( "locationIntro" to Schema.string(), "tours" to Schema.array( Schema.obj( mapOf( "title" to Schema.string(), "description" to Schema.string(), "stops" to Schema.array( Schema.obj( mapOf( "name" to Schema.string(), "detailedName" to Schema.string(), "description" to Schema.string() ) ) ) ) ) ) ) ) val model = Firebase.ai(backend = GenerativeBackend.googleAI()).generativeModel( modelName = "gemini-3.5-flash", tools = listOf(Tool.googleMaps()), generationConfig = generationConfig { responseMimeType = "application/json" responseSchema = responseJsonSchema } ) val result = model.generateContent("The user is at latitude ${pose.latitude} and longitude ${pose.longitude}. Generate exactly 3 diverse tours near this location (e.g., historical, food, nature). All tour ideas should be walking distance only.")
大语言模型非常擅长生成丰富的描述,但有时可能会产生幻觉,给出不准确的经纬度坐标。为了解决这个问题,我们使用了 Google 地图 Grounding 来让 AI 接地。
3. Gemini 2.5 TTS:您的语音向导
为了让导游感觉真实存在,我们实现了动态旁白。
使用 gemini-2.5-flash-tts model,我们可以配置模型生成配置,使其原生返回音频数据,而不仅仅是文本!您可以按照以下步骤申请ResponseModality.AUDIO:
val ttsModel = Firebase.ai(backend = GenerativeBackend.googleAI()) .generativeModel( modelName = "gemini-2.5-flash-tts", generationConfig = generationConfig { // Instruct the model to return Audio responseModalities = listOf(ResponseModality.AUDIO) } ) val response = ttsModel.generateContent("Say in a neutral but positive voice:\n$prompt") // Extract the raw audio bytes from the response val audioBytes = response.candidates.firstOrNull()?.content?.parts ?.filterIsInstance<InlineDataPart>() ?.firstOrNull { it.mimeType.contains("audio") }?.inlineData
4. 使用 Jetpack XR 打造 3D 体验
最后一步是在用户的视野范围内呈现这些数据。借助 Jetpack XR SDK,您可以直观地从 2D Android 界面过渡到空间计算。
我们使用 Jetpack Compose for XR 构建了空间组件。为了表示游览路线上的景点,我们构建了一个名为 InfoSphere 的可组合项,其中包含一个 3D 球体的 GltfModel,该球体漂浮在空间中,可以与之互动以显示信息。
使用 Jetpack XR SDK,我们可以通过 SpatialBox 和 SceneCoreEntity 将 3D 模型与 Compose 界面并排放置。我们还使用了 InteractableComponent 来响应用户点按。
通过将适用于传统 Compose 界面表面的 AnimatedSpatialVisibility 与 SceneCoreEntity 3D 元素相结合,我们能够将数据无缝融入物理世界。
@Composable fun InfoSphere( content: InfoBubbleContent, session: Session, sphereModel: GltfModel, isSelected: Boolean, onClick: () -> Unit ) { // SpatialBox lets us arrange 3D components and SpatialPanels together SpatialBox( SubspaceModifier .offset(x = 2.dp, y = 1.dp, z = (-3).dp) // Positioned in 3D space ) { // Smoothly animate the visibility of our 2D Compose UI Panel AnimatedSpatialVisibility(visible = isSelected) { SpatialPanel { InfoBubble(content) // Regular 2D Compose UI } } // Render our interactive 3D sphere SceneCoreEntity( factory = { GltfModelEntity.create(session, sphereModel).also { entity -> // Make the 3D model respond to user taps entity.addComponent(InteractableComponent.create(session) { inputEvent -> if (inputEvent.action == InputEvent.Action.UP) { onClick() } }) } } ) } }
立即探索 Android XR 的无限可能
通过构建 XR Geospatial Tour 应用,我们发现,对于 Android 开发者来说,打造世界级空间体验的门槛比以往任何时候都要低。Geospatial API 现已在 Android XR 上推出预览版,可让您的应用无缝感知周围的物理世界。通过将 Compose for XR 的 API 与 VPS 的高精度位置数据以及 Gemini 的生成功能相结合,我们可以打造出能够理解用户所在位置和所看内容的体验。
为了帮助您亲身体验 Android XR,我们很高兴地宣布,Android XR 开发者催化剂计划现已开放申请,该计划包含 XREAL Project Aura。从今天起,您可以申请在未来几个月内获取 XREAL Project Aura 开发者套件或我们的带屏眼镜开发者套件!
*免责声明:仅在部分设备上提供。需要连接到互联网。适用于兼容的应用和平台。实际情况可能会有所不同。
-
产品资讯随着智能体开发不断加速,Android 工程领域正迈向一个令人振奋的新境界:从辅助性代码补全,跃升至智能体在您的指挥下执行端到端任务。您可以完全自主、灵活地选择要使用的模型和智能体。
Jason Buchel • 阅读用时:3 分钟 -
产品资讯今天,我们分享了如何将“不只是商店”的愿景推进到下一个阶段。从月活跃用户数超过 2.5 亿的“我”标签页,到连接超过 7 亿玩家资料的统一游戏平台,Google Play 始终致力于满足用户的各种需求。
Paul Feng • 阅读用时:3 分钟 -
产品资讯我们很高兴能通过 Googlebook 帮助用户表达自我,并让他们能够使用这些工具。
Cyrus Stoller • 阅读用时:2 分钟
每周通过电子邮件接收最新的 Android 开发洞见。