在今年的 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,打造免持的沉浸式徒步導覽體驗。
免責事項:影片和導覽應用程式僅供示範。部分步驟經過簡化。圖中硬體可能仍在開發階段,最終產品詳細資料可能不同。
接下來,我們將逐步說明實作細節,並展示如何結合這些 API,打造全球規模的空間體驗。
1. 使用 ARCore Geospatial API (VPS) 精確定位使用者
結合 GPS 的強大功能和 VPS 的精確度,提升 XR 導航體驗。VPS 具備高準確度和精確方向,可讓 3D 路線控點與實體世界對齊。
因此,Android XR 的 Geospatial API 可協助您打造自訂體驗。VPS 採用先進的電腦視覺技術,可提供比 GPS 更準確的地理空間姿勢 (包括經緯度和方向)。
以下說明如何將裝置方向對應至地理空間座標,擷取使用者的地理空間姿勢:
// 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 UI 轉換至空間運算。
我們使用 Jetpack Compose for XR 建構空間元件。為了呈現導覽路線上的搜尋點,我們建構了名為 InfoSphere 的可組合函式,其中包含漂浮在空間中的 3D 球體 GltfModel,使用者可與其互動來查看資訊。
使用 Jetpack XR SDK,我們可以使用 SpatialBox 和 SceneCoreEntity,將 3D 模型與 Compose UI 放在一起。我們也使用 InteractableComponent 回應使用者輕觸。
只要將傳統 Compose UI 介面的 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 開發人員高峰會上宣布,將廣泛提供多項工具和 API,旨在消除日常摩擦,讓您更靈活地建構出色的 Android 應用程式。
Matthew McCullough • 閱讀時間:4 分鐘 -
產品最新消息Android Studio Rabbit 2 穩定版已推出,可供您在正式環境中使用。此版本包含多項重要功能,可提升開發效率,例如「自備代理」、全新 XR 模擬器功能、LeakCanary 更新、全新代理技能管理工具、AI 程式碼審查等。
Matthew Warner • 閱讀時間:3 分鐘 -
產品最新消息如果應用程式指定即將推出的 Android 版本,將無法再透過 WRITE_CONTACTS 權限直接寫入聯絡人資料。
Roxanna Aliabadi Walker • 閱讀時間:6 分鐘
每週透過電子郵件接收 Android 開發人員的最新深入分析。