Tworzenie przewodnika po rzeczywistości mieszanej za pomocą Androida XR, interfejsu Geospatial API i Gemini
Czas czytania: 7 min
Na tegorocznej konferencji Google I/O ogłosiliśmy aktualizację dotyczącą rozwiązań przestrzennych: Geospatial API jest teraz dostępny w wersji zapoznawczej w ARCore dla Jetpack XR. Dzięki wprowadzeniu systemu pozycjonowania wizualnego (VPS) Google do Androida XR, Android XR umożliwia zakotwiczanie treści cyfrowych w świecie fizycznym z dokładnością do centymetra i precyzyjną orientacją w obsługiwanych obszarach*. Aby sprawdzić, jakie możliwości otwiera Geospatial API, nasz zespół stworzył wersję demonstracyjną: XR Geospatial Tour.
Wyobraź sobie, że wchodzisz do nowego miasta, zakładasz przewodowe okulary XR (takie jak nadchodzący XREAL Project Aura) i od razu masz do dyspozycji kompetentnego lokalnego przewodnika. Nie musisz patrzeć na mapę 2D – zamiast tego modele 3D delikatnie wskazują Ci drogę, a inteligentny głos opowiada o zabytkach historycznych znajdujących się przed Tobą. Połączyliśmy Geospatial API, Gemini API za pomocą Firebase AI Logic, powiązanie ze źródłami informacji przy użyciu Map Google i Jetpack XR SDK, aby stworzyć wciągającą wycieczkę pieszą bez użycia rąk.
Zastrzeżenie: film i aplikacja Tour Guide służą wyłącznie do celów demonstracyjnych. Niektóre sekwencje zostały skrócone. Przedstawiony sprzęt może być w fazie rozwoju. Szczegóły produktu końcowego mogą się różnić.
Przyjrzyjmy się szczegółom implementacji i pokażmy, jak połączyliśmy te interfejsy API, aby stworzyć rozwiązanie przestrzenne na skalę globalną.
1. Określanie położenia użytkownika za pomocą ARCore Geospatial API (VPS)
Wzbogać nawigację w rzeczywistości rozszerzonej (XR), łącząc moc GPS z precyzją VPS. Dokładność i precyzyjna orientacja, które zapewnia VPS, pozwalają na wyrównanie punktów orientacyjnych 3D ze światem fizycznym.
Dlatego Geospatial API na Androidzie XR może pomóc Ci w tworzeniu niestandardowych rozwiązań. Dzięki zaawansowanemu systemowi rozpoznawania obrazów VPS próbuje podać GeospatialPose (w tym szerokość i długość geograficzną oraz kierunek), która jest dokładniejsza niż GPS.
Oto jak pobieramy położenie geoprzestrzenne użytkownika, mapując orientację urządzenia na współrzędne geoprzestrzenne:
// 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}") }
Ponieważ całe rozwiązanie opiera się na tej dokładności, monitorujemy wartości horizontalAccuracy i orientationYawAccuracy, dopóki nie osiągną one naszych progów. Jeśli użytkownik znajduje się w pomieszczeniu lub w nierozpoznanym obszarze, prosimy go o „wyjście na zewnątrz i rozejrzenie się”.
2. Tworzenie planu podróży za pomocą Gemini API i powiązania ze źródłami informacji przy użyciu Map Google
Gdy mamy już lokalizację, używamy Gemini API za pomocą Firebase AI Logic, aby poprosić model Gemini o pełnienie funkcji lokalnego przewodnika. Przekazujemy modelowi współrzędne użytkownika i prosimy go o zwrócenie uporządkowanej odpowiedzi JSON zawierającej pobliskie wycieczki piesze:
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.")
Duże modele językowe świetnie generują bogate opisy, ale czasami mogą podawać nieprawdziwe współrzędne geograficzne. Aby rozwiązać ten problem, użyliśmy powiązania ze źródłami informacji przy użyciu Map Google, aby powiązać AI ze źródłami informacji.
3. Głos, który Cię poprowadzi: Gemini 2.5 TTS
Aby przewodnik był bardziej realistyczny, zaimplementowaliśmy dynamiczne lektory.
Za pomocą gemini-2.5-flash-tts model możemy skonfigurować generowanie modelu tak, aby zamiast tekstu zwracał dane audio. Oto jak możesz poprosić o 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. Ożywianie świata w 3D za pomocą Jetpack XR
Ostatnim elementem układanki jest renderowanie tych danych w polu widzenia użytkownika. Jetpack XR SDK ułatwia przejście z interfejsu Androida 2D na obliczenia przestrzenne.
Do tworzenia komponentów przestrzennych użyliśmy Jetpack Compose for XR. Aby przedstawić ciekawe miejsca na trasie, stworzyliśmy komponent Composable o nazwie InfoSphere, który zawiera GltfModel kuli 3D unoszącej się w przestrzeni. Można z nią wchodzić w interakcje, aby wyświetlić informacje.
Za pomocą Jetpack XR SDK możemy umieszczać modele 3D obok interfejsu Compose za pomocą SpatialBox i SceneCoreEntity. Użyliśmy też InteractableComponent, aby reagować na dotknięcia użytkownika.
Łącząc AnimatedSpatialVisibility w przypadku tradycyjnych powierzchni interfejsu Compose z elementami 3D SceneCoreEntity, możemy płynnie łączyć dane ze światem fizycznym.
@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() } }) } } ) } }
Poznaj możliwości Androida XR
Tworzenie aplikacji XR Geospatial Tour pokazało nam, że bariera wejścia dla rozwiązań przestrzennych na skalę globalną jest dla programistów na Androida niższa niż kiedykolwiek. Dzięki Geospatial API, który jest teraz dostępny w wersji zapoznawczej na Androidzie XR, Twoje aplikacje mogą płynnie rozpoznawać otaczający je świat fizyczny. Łącząc interfejsy API Compose for XR z danymi o lokalizacji o wysokiej precyzji z VPS i możliwościami generatywnymi Gemini, możemy tworzyć rozwiązania, które rozpoznają zarówno miejsce, w którym znajduje się użytkownik, jak i to, na co patrzy.
Aby pomóc Ci w praktycznym korzystaniu z Androida XR, z przyjemnością otwieramy nabór do programu Android XR Developer Catalyst, który obejmuje XREAL Project Aura. Od dziś możesz zgłosić się, aby w najbliższych miesiącach uzyskać dostęp do zestawu deweloperskiego XREAL Project Aura lub zestawu deweloperskiego okularów.
*Zastrzeżenie: funkcja jest dostępna na wybranych urządzeniach. Wymagane jest połączenie z internetem. Wymaga zgodnych aplikacji i platform. Wyniki mogą się różnić.
-
r.r.
Każdy z nas to zna: przewijasz ulubiony kanał w mediach społecznościowych w słabo oświetlonym pomieszczeniu i nagle pojawia się film HDR. Jest tak jasny, że musisz zmrużyć oczy, a może nawet przyciemnić ekran, żeby przeczytać podpis.
Tibian Elsheikh, Jeffrey Jose • Czas czytania: 2 minuty -
Dziś udostępniamy Androida 17 na większości obsługiwanych urządzeń Pixel. W najbliższych miesiącach pojawią się nowe urządzenia z Androidem 17.
Matthew McCullough • Czas czytania: 13 minut -
Wiadomości o usługachW marcu przedstawiliśmy Android Bench – nasz ranking dużych modeli językowych do zadań związanych z tworzeniem aplikacji na Androida. Od tego czasu ulepszyliśmy test porównawczy na podstawie Waszych opinii, m.in. dodając ocenę modeli o otwartych wagach oraz wymiary kosztów i wydajności.
Zoe Lopez-Latorre • Czas czytania: 3 minuty
Otrzymuj co tydzień najnowsze informacje o tworzeniu aplikacji na Androida na swoją skrzynkę odbiorczą.